Apache ant清单类路径?

9 java ant manifest.mf

我有一个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
Run Code Online (Sandbox Code Playgroud)

据我所知,我正在使用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>
Run Code Online (Sandbox Code Playgroud)

任何正确方向的推动都值得赞赏.谢谢

小智 38

假设库不会将位置从编译更改为执行jar文件,您可以在编译目标之外的类路径中创建一个路径元素,如下所示:

<path id="compile.classpath">
    <fileset dir="lib" includes="**/*.jar"/>
</path>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用javac任务中创建的路径代替当前的类路径.

<classpath refid="compile.classpath"/>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该路径设置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> 
Run Code Online (Sandbox Code Playgroud)

manifestclasspath生成一个格式正确的类路径,用于清单文件,必须在72个字符后包装.如果不使用manifestclasspath任务,包含许多jar文件或长路径的长类路径可能无法正常工作.


Mic*_*ers 8

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

<manifest>
    <attribute name="Main-Class" value="${main.class}"/>
    <attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>
Run Code Online (Sandbox Code Playgroud)

换句话说,看起来您只需要为已有的清单任务添加另一个属性.

另请参阅Manifest Task文档.