Ant Contrib如果是可选的JAR META-INF

时间:2013-02-01 20:57:14

标签: java ant jar ant-contrib meta-inf

我有一个场景,我试图在多个项目中重用相同的build.xml文件。在每种情况下,最终目标都是dist,即JAR所有内容。唯一的区别是一些项目有src/main/java/META-INF/*目录,而其他项目没有(并且只有src/main/java/*目录。)

如果构建看到<if/>目录可用,我想使用Ant-Contrib 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-INF目录,并将所有src/main/java/META-INF内容复制到其中。
  3. 有什么想法?提前谢谢。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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 points out,您实际上并不需要这个来回答这个具体问题,但对于其他情况,这是一个有用的技巧。我发现在定义<path>元素而不是文件集时更有用。

答案 2 :(得分: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