Java Ant Contrib If用于可选JAR META-INF
我有一个场景,我试图在多个项目中重用相同的Java Ant Contrib If用于可选JAR META-INF,java,ant,jar,ant-contrib,meta-inf,Java,Ant,Jar,Ant Contrib,Meta Inf,我有一个场景,我试图在多个项目中重用相同的build.xml文件。在每种情况下,最终的目标都是一个dist,它会把所有内容都搅乱。唯一的区别是,一些项目有src/main/java/META-INF/*目录,而其他项目没有(并且只有src/main/java/*目录) 如果构建看到可用的src/main/java/META-INF/*目录,我想使用Ant Contrib任务来选择性地定义META-INF/目录。比如说: <jar jarfile="myapp.jar"> &l
build.xml
文件。在每种情况下,最终的目标都是一个dist
,它会把所有内容都搅乱。唯一的区别是,一些项目有src/main/java/META-INF/*
目录,而其他项目没有(并且只有src/main/java/*
目录)
如果构建看到可用的src/main/java/META-INF/*
目录,我想使用Ant Contrib
任务来选择性地定义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>
但有两件事让我窒息了:
任务中嵌套
;及
任务,在类路径的根目录下创建META-INF
目录,并将所有src/main/java/META-INF
内容复制到其中有什么想法吗?提前感谢。消息是正确的,因为
本身就是一个任务,您不能在
任务中嵌套其他任务。但是,您可以使用
任务定义一个具有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>
实际上,你不需要这个来回答这个特定的问题,但在其他情况下,这是一个需要注意的有用技巧。我发现在定义
元素而不是文件集时,它更有用。您让它变得比必要的更难。只需使用以下任务,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/
的项目时,您只需使用metainf运行jar
,这样您就可以在jar中包含来自其他目录的类,并且还可以选择将src/main/java/META-INF的内容作为META-INF包含在内?如果是这样,您可以在jar任务中使用metainf嵌套元素。清单是其中一个文件吗?谢谢@martin clayton(+1)-我当然不反对使用manifest.MF
,但目前我的项目没有清单(至少没有我明确定义的清单)。所以,如果我必须创建一个虚拟/空白的manfiest,或者让Ant为我创建一个,我可以这样做。但要回答您的问题:不,清单当前不是其中一个文件。