我正在使用ANT创建应用程序的JAR文件。在我阅读时,我应该从命令行中将我需要的外部Jars作为参数,但我想构建一个Manifest文件。
这是我的build.xml文件(只是我构建jar的部分)
<!-- Build jar from classes -->
<target name="jar" depends="compile" description="Build a jar file.">
<manifestclasspath property="jar.classpath" jarfile="${target.build.main}/main">
<classpath>
<fileset dir="${target.build.main}/lib" includes="*.jar"/>
</classpath>
</manifestclasspath>
<jar destfile="${target.dist}/configuration-deployer.jar" basedir="${target.build.main}">
<manifest>
<attribute name="Main-Class" value="${dist.main.class}" />
<attribute name="Class-Path" value="${jar.classpath}" />
</manifest>
</jar>
</target>
现在这是清单文件的摘录
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.4
Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.)
Main-Class: com.sap.coas.deployer.StoreInstanceOnMove
Class-Path: lib/ConfigurationMetamodel-1.jar lib/Consumer_api-1.jar li
b/FunctionalSystemMetaModel-1.jar lib/WS_api-1.jar lib/activemq-core-
5.7.0.jar lib/activemq-protobuf-1.1.jar ..... other jar
如果我打开生成的JAR,我可以在META-INF文件夹中看到清单,并且lib文件夹包含所有库。 所以JAR的结构是这样的:
/META-INF/manifest.mf
/lib/ConfigurationMetamodel-1.jar
/lib/otherJar.jar ........
但是当我尝试运行时
java -jar myJar.jar
我得到了ClassNotFoundException,我确信包含抛出异常的类的jar在lib文件夹中。
谢谢!
答案 0 :(得分:0)
您无法在清单文件中使用Class-Path标头指向JAR文件中的JAR。请检查以下链接。您应该将lib文件夹与那些JAR一起放在myJar.jar的同一文件夹中。
Adding Classes to the JAR File's Classpath
注意:Class-Path标头指向本地网络上的类或JAR文件,而不是JAR文件中的JAR文件或可通过Internet协议访问的类。要将JAR文件中的JAR文件中的类加载到类路径中,必须编写自定义代码来加载这些类。例如,如果MyJar.jar包含另一个名为MyUtils.jar的JAR文件,则不能使用MyJar.jar清单中的Class-Path标头将MyUtils.jar中的类加载到类路径中。