我有一个场景,我试图在多个项目中重用同一个build.xml
文件。在每种情况下,最终目标都是 JAR 解决所有内容的dist
。唯一的区别是一些项目有一个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>
但我在这里窒息了两件事:
- 当我运行这个目标时,我得到一个构建异常,指出我无法在
<jar/>
任务中嵌套<if/>
;和 - 我不确定如何配置
<jar/>
任务以在类路径的根目录下创建一个META-INF
目录,并将所有src/main/java/META-INF
内容复制到其中。
有什么想法吗?提前谢谢。
你让它变得比必要的更难。只需使用以下任务,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>
听起来您想利用更模块化的构建配置。有两个目标怎么样:
<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
.
该消息是正确的,因为<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>
元素而不是文件集时更有用。