JAR Manifest中Main-Class属性是相对路径还是绝对路径?
问题1:Main-Class的配置值是否为src.java.main.Program?
不是,这个配置是错误的。
Main-Class属性的取值规则是入口类的全限定名(包名+类名),和源文件的磁盘路径、源码根目录的外层路径没有任何关系。- 以你给出的源文件路径
./src/java/main/Program.java为例:通常src/java/main是Java项目的源码根目录(即Ant构建时javac任务指定的srcdir根路径),如果你的Program.java没有声明package包,那它的全限定名就是Program,对应的Main-Class应该配置为Main-Class: Program;如果Program.java开头声明了package main.java;,全限定名才是main.java.Program,但绝对不会包含src这个源码外层目录。 - 补充验证规则:你编译后找到
Program.class文件,从class文件所在的目录结构往上数,去掉编译输出根目录后的路径就是包名,比如编译输出到build/classes,Program.class路径是build/classes/com/xxx/Program.class,那全限定名就是com.xxx.Program。
问题2:Manifest文件的存放位置是否会影响Main-Class的配置?
不需要调整,和根目录下的配置完全一致。
- Manifest文件在你本地项目中的存放路径(不管是根目录还是
./lib子目录),只是Ant构建时读取Manifest文件的本地路径,和JAR包内的规则无关。只要构建时Ant能正确读取到这个Manifest文件,并且将其打包到JAR的META-INF/MANIFEST.MF位置,里面的Main-Class配置就只和类的全限定名有关,和Manifest本地存放位置没有关联。
Ant构建场景补充说明
你在Ant的<jar>任务中指定Manifest路径时,只需要填对本地项目中Manifest文件的相对路径即可,不需要修改Manifest内部的Main-Class配置:
<jar destfile="build/app.jar" manifest="./lib/MANIFEST.MF"> <!-- 其他配置,比如指定编译后的class文件路径 --> <fileset dir="build/classes"/> </jar>
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

