【问题标题】:Apache ant manifest class-path?Apache ant清单类路径?
【发布时间】:2010-10-15 12:49:13
【问题描述】:

我有一个 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>

感谢任何朝着正确方向的推动。谢谢

【问题讨论】:

    标签: java ant manifest.mf


    【解决方案1】:

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

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

    因此,换句话说,您似乎只需要向已有的清单任务添加另一个属性。

    另请参阅Manifest Task documentation

    【讨论】:

    • 在你回答之前我自己得出了这个结论,尽管我不知道 jar.classpath。我在 ant 文档 ant.apache.org/manual/CoreTasks/manifestclasspath.html 中被 甩了
    • jar.classpath 是由 NetBeans 在构建文件的其他地方定义的,我相信。
    • 您答案中的 Ant 链接已经过时 - “CoreTasks”和“OptionalTask​​s”现在都只是“任务”。
    • @martin Clayton:感谢您的 ping。请随时更新您发现的陈旧链接。
    【解决方案2】:

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

    <path id="compile.classpath">
        <fileset dir="lib" includes="**/*.jar"/>
    </path>
    

    然后你可以在你的 javac 任务中使用创建的路径来代替你当前的类路径。

    <classpath refid="compile.classpath"/>
    

    然后您可以使用该路径来设置清单类路径。

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

    【讨论】:

    猜你喜欢
    • 2011-08-18
    • 2010-10-25
    • 2010-10-30
    • 2011-06-13
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多