我有一个库,它通常通过手工制作JAR及其依赖项及其javadoc的zip文件来分发。我想在ant中自动执行此任务。
对于这个发行版的预期用例来说,一个奇怪的地方是,当它被解包时,我的团队创建的JAR和任何库JAR都应该在相同的路径中。我们不能让myproject.zip/the.jar
和myproject.zip/lib/a_library.jar
都在zip的根路径中。
我已经成功地完成了以下任务:
<target name="myproject.distributable" depends="artifact.mycompany_myproject, myproject.javadoc"
description="Build the distributable JAR for myproject">
<zip destfile="${basedir}/dist/myproject.zip">
<fileset file="${temp.jar.path.mycompany_myproject.jar}"/>
<zipfileset dir="mycompany_myproject/lib" prefix="lib">
<patternset id="myproject.dist.libs">
<include name ="**/*.jar"/>
</patternset>
</zipfileset>
<zipfileset dir="docs/myproject" prefix="docs"/>
</zip>
</target>
它唯一不做的是'flatten'或将库jar移动到zip的根路径。
我已经尝试使用<zipfileset prefix="/">
库,但没有如预期的那样工作。
zipfileset
的prefix
属性用于描述文件在创建的zip文件中应该出现的位置。由于您希望jar文件出现在zip文件的根目录,因此不需要指定它,并且可以省略它(我不确定将其设置为"/"会产生什么效果,我认为省略它会更安全)。
您的问题似乎是,您的库存储在lib
目录下的子目录中,但您希望它们直接在zip文件的根目录中。与copy
任务不同,'zip'任务不接受映射器来直接更改文件在zip中的显示方式,但如果您使用ant 1.7或更高版本,它将接受资源集合。你可以使用mappedresources
元素与fileset
和flattenmapper
来获得你想要的效果:
<target name="myproject.distributable" depends="artifact.mycompany_myproject, myproject.javadoc" description="Build the distributable JAR for myproject">
<zip destfile="${basedir}/dist/myproject.zip">
<fileset file="${temp.jar.path.mycompany_myproject.jar}"/>
<mappedresources>
<fileset dir="mycompany_myproject/lib" includes="**/*.jar" />
<flattenmapper />
</mappedresources>
<zipfileset dir="docs/myproject" prefix="docs"/>
</zip>
</target>
这意味着您不必首先使用copy
将jar文件放入暂存区。
根据这篇文章,zipgroupfileset
应该可以做到这一点;我还没有试过……