我有一个库,通常通过手工制作JAR及其依赖项的zip文件及其javadoc来分发。我想在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>
唯一不做的是'展平'或将库JAR移动到zip的根路径。
我已经尝试将<zipfileset prefix="/">
用于libs但是没有按预期工作。
答案 0 :(得分:7)
prefix
的{{1}}属性用于描述文件在创建的zip文件中的显示位置。既然你希望jar文件出现在zip文件的根目录下,你不需要指定它,并且可以将其保留(我不确定将它设置为“/”的效果是什么,我认为省略它会更安全。)
您的问题似乎是您的库存储在zipfileset
目录下的子目录中,但您希望它们直接位于zip文件的根目录中。与lib
任务不同,'zip'任务不直接接受映射器来更改文件在zip中的显示方式,但如果您使用的是Ant 1.7或更高版本,它将接受{{3} }。您可以将resource collection元素与copy
和mappedresources
一起使用,以获得您所追求的效果:
fileset
这意味着您不必先使用<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>
将罐子放入临时区域。
答案 1 :(得分:0)
根据this post,zipgroupfileset
应该可以做到;我自己没试过......