前言
以前只简单了解过javac,现在重新学习java程序的编译运行,特此记录一下。
一、Java程序编译
使用javac会默认编译到同一个文件目录,要想进行不同目录的编译需要执行以下命令:
-d <目录> //指定放置生成的类文件的位置
1.无包名的类编译:
javac -d target src/Hello.java //target为<想要存放class的目录>,src为<存放java文件的目录>
2.有包名的多个类编译:
javac -d target src/Hello.java src/start/World.java -encoding utf-8
(package start;)
3.使用第三方jar包的类编译:
javac -d target src/rand/Rand.java -encoding utf-8 -classpath lib/*
二、构建jar包
1.不指定MANIFEST.MF构建jar包
jar -cvfe abc.jar start.World -C target/ .
(c创建v详细输出f指定jar包名称e指定入口类)
(-C xx/ .切换到xx目录并将目录下所有东西打包)
(打包成功后会自动生成一个只有入口类没有搜索路径的MANIFEST.MF文件)
jar -cvf rand.jar -C target/ rand/Rand.class
(打包成功后自动生成一个空的MANIFEST.MF文件)
2.指定MANIFEST.MF构建jar包
jar -cvfm rand.jar META-INF/MANIFEST.MF -C target/ rand/Rand.class
(META-INF目录中带有自定义的MANIFEST.MF文件)
MANIFEST.MF文件
(MANIFEST.MF文件的编写,冒号后面要有空格,最后一行必须回车!)
Class-Path:
应用程序或者类装载器使用该值来构建内部的类搜索路径,注意:只有此处不能使用通配符lib/*.jar或lib/*
Main-Class:
定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过java -jar x.jar来运行该jar文件
三、执行jar包
1.jar包中MANIFEST.MF指定了Main-Class和Class-Path:
java -jar rand.jar
2.jar包中MANIFEST.MF未指定某一项或者两者都未指定:
windows
java -cp rand.jar;lib/* rand.Rand
linux
java -cp rand.jar:lib/* rand.Rand
(命令行中入口类不可少,哪怕MANIFEST.MF文件中已指定)
说明
-cp为-classpath的缩写
注意区分三-2中windows下为分号; linux下为冒号: