4

我有一个场景,我试图build.xml在多个项目中重用同一个文件。在每种情况下,最终目标都是distJAR 将所有内容都完成。唯一的区别是一些项目有一个src/main/java/META-INF/*目录,而另一些则没有(只有一个src/main/java/*目录)。

如果构建看到可用的目录,我想使用 Ant-Contrib<if/>任务来选择性地定义一个目录。所以是这样的:META-INF/src/main/java/META-INF/*

<jar jarfile="myapp.jar">
    <if>
        <available file="src/main/java/META-INF" />
        <then>
            <!--
                Copy everything from src/main/java/META-INF into
                the JAR's META-INF directory.

                But how?!?
            -->
            <echo message="I'm trying to copy META-INF!" />
        </then>
    </if>
</jar>

但我在这里对两件事感到窒息:

  1. 当我运行这个目标时,我得到一个构建异常,指出我不能<if/><jar/>任务中嵌套一个;和
  2. 我不确定如何配置任务以在类路径的根目录<jar/>创建目录,并将所有内容复制到其中。META-INFsrc/main/java/META-INF

有什么想法吗?提前致谢。

4

3 回答 3

4

你让它变得比必要的更难。只需使用以下任务,如果 META-INF 文件夹存在,它将包含在 jar 中,如果不存在则忽略:

<target name="dist">
    <jar destfile="test.jar">
        <fileset dir="classes"/> <-- or whatever directory you want to put in the jar -->
        <metainf dir="src/main/java/META-INF" erroronmissingdir="false"/>
    </jar>
</target>
于 2013-02-04T13:20:00.627 回答
1

该消息是正确的,因为<if>它本身就是一项任务,您不能在任务中嵌套其他<jar>任务。但是,您可以使用该<if>任务定义一个带有 ID 的合适文件集,然后使用 refid 将其包含在 JAR 中:

<if>
    <available file="src/main/java/META-INF" />
    <then>
        <fileset id="src.metainf" dir="src/main/java/META-INF" />
    </then>
    <else>
        <fileset id="src.metainf" dir="." excludes="**/*" />
    </else>
</if>

<jar destfile="myapp.jar">
    <metainf refid="src.metainf" />
</jar>

正如JB Nizet 指出的那样,您实际上并不需要这个来回答这个特定的问题,但对于其他情况,这是一个有用的技巧。<path>我发现在定义元素而不是文件集时它更有用。

于 2013-02-04T13:14:33.373 回答
1

听起来您想利用更加模块化的构建配置。有两个目标怎么样:

<target name="jar">
    <!-- Normal JAR tasks like you currently have (sans the metainf stuff). -->
</target>

<target name="jar-with-metainf">
    <jar destfile="test.jar">
        <fileset dir="classes"/>
        <metainf dir="src/main/java/META-INF"/>
    </jar>
</target>

然后,当您想要构建包含您META-INF/的项目时,您只需运行jar-with-metainf.

于 2013-02-11T19:02:09.037 回答