如何在ant中获取flattenmapper结果?

4
请查看下面的ant文件中的一些目标:
<fileset id="test-dep-jars" dir="o:/java">
    <include name="junit-4.10.jar"/>
    <include name="easymock-3.1\easymock-3.1.jar"/>
    <include name="easymockclassextension-3.1\easymockclassextension-3.1.jar"/>
</fileset>

<target name="copy-test-deps">
    <mkdir dir="${deploy.dir}"/>
    <copy todir="${deploy.dir}">
        <fileset refid="test-dep-jars"/>
        <flattenmapper/>
    </copy>
</target>

<target name="jar" depends="copy-test-deps">
    <jar destfile="${deploy.dir}/test-${ant.project.name}.jar" basedir="${test.classes.dir}" 
         includes="**/*.class" filesetmanifest="skip">
        <manifest>
            <attribute name="Class-Path"
                       value="${ant.project.name}.jar junit-4.10.jar easymock-3.1.jar easymockclassextension-3.1.jar"/>
        </manifest>
    </jar>
</target>

我的问题是我必须两次声明测试依赖库——一次是在定义 test-dep-jars 文件集时,另一次是在指定生成的 jar 的 Class-Path 清单属性时。
如果我只能获得 flattenmapper 的结果,那么我就可以直接在 Class-Path 中使用它。
我该如何获取 flattenmapper 的结果呢?
谢谢。
2个回答

4
如果您想使用flattenmapper,可以使用以下步骤:...
<pathconvert property="mf.classpath" pathsep=" ">
    <path refid="build.class.path" />
    <flattenmapper />
</pathconvert>

<manifest>
            <attribute name="Class-Path"
                       value="${ant.project.name}.jar ${mf.classpath}"/>
        </manifest>

3
我建议使用manifestclasspath任务替代:manifestclasspath
<manifestclasspath property="jar.classpath" jarfile="${jar.file}">
    <classpath>
        <fileset dir="${deploy.dir}" includes="*.jar"/>
    </classpath>
</manifestclasspath>

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

它将生成正确的类路径属性定义,甚至可以使用相对路径(例如,如果您将依赖的JAR文件放置在子目录中)。

我发现manifestclasspath任务不太方便,因为它存储了类路径JAR的相对路径。所以在我的情况下,pathconvert和flattenmapper(Vishal的答案)效果最好。 - Jarekczek
1
@Jarekczek 已经明白了。然而,我通常会将我的可执行jar文件与“lib”子目录中提供的依赖项一起发布。在这种情况下,manifestclasspath生成相对路径的能力实际上非常有用。如果您检查我的示例,我故意使用一个文件集引用部署目录中的jar文件,该位置将位于我的项目的分发位置,而不是源目录。 - Mark O'Connor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接