我有一个java项目的标准项目布局:
project /
src /
source_file_1.java
...
source_file_N.java
build /
classes /
source_file_X.class
...
jar /
MyJar.jar
lib /
SomeLibrary.jar
SomeOtherLibrary.jar
据我所知,我正在使用Ant正确构建项目。我需要在Manifest文件中设置class-path属性,以便我的类可以使用所需的库。
build.xml
中的以下相关信息<target name="compile" depends="init">
<javac srcdir="src" destdir="build\classes">
<classpath id="classpath">
<fileset dir="lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</javac>
</target>
<target name="jar" depends="compile">
<jar destfile="build\jar\MyJar.jar" basedir="build\classes" >
<manifest>
<attribute name="Built-By" value="${user.name}" />
</manifest>
</jar>
</target>
任何正确方向的推动都值得赞赏。感谢
答案 0 :(得分:38)
假设库不会将位置从编译更改为执行jar文件,您可以在编译目标之外的类路径中创建一个路径元素,如下所示:
<path id="compile.classpath">
<fileset dir="lib" includes="**/*.jar"/>
</path>
然后,您可以在javac任务中使用创建的路径代替当前的类路径。
<classpath refid="compile.classpath"/>
然后,您可以使用该路径设置manifestclasspath。
<target name="jar" depends="compile">
<manifestclasspath property="jar.classpath" jarfile="build\jar\MyJar.jar">
<classpath refid="compile.classpath"/>
</manifestclasspath>
<jar destfile="build\jar\MyJar.jar" basedir="build\classes" >
<manifest>
<attribute name="Built-By" value="${user.name}" />
<attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>
</jar>
</target>
manifestclasspath生成一个格式正确的类路径,用于清单文件,必须在72个字符后包装。如果不使用manifestclasspath任务,则包含许多jar文件或长路径的长类路径可能无法正常工作。
答案 1 :(得分:8)
查看我的NetBeans生成的构建文件,我在-do-jar-with-libraries
任务中找到了这个代码段:
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
<attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>
换句话说,看起来您只需要为已有的清单任务添加另一个属性。