9

我有一个 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 文件中设置类路径属性,以便我的类可以使用所需的库。

以下相关信息来自 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>

任何朝着正确方向的推动都值得赞赏。谢谢

4

2 回答 2

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 文件或长路径的长类路径可能无法正常工作。

于 2009-03-25T20:57:02.160 回答
8

查看我的 NetBeans 生成的构建文件,我在-do-jar-with-libraries任务中找到了这个片段:

<manifest>
    <attribute name="Main-Class" value="${main.class}"/>
    <attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>

所以换句话说,看起来你只需要向你已经拥有的清单任务添加另一个属性。

另请参阅清单任务文档

于 2009-03-25T18:52:56.030 回答