使用ant创建一个带有JAR和库和doc的可分发zip文件

Fre*_*eit 1 java ant distribution

我有一个库,通常通过手工制作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>
Run Code Online (Sandbox Code Playgroud)

它唯一没有做的是'展平'或将库JAR移动到zip的根路径.

我已经尝试过使用<zipfileset prefix="/">libs但是没有按预期工作.

mat*_*att 7

prefix属性zipfileset用于描述文件在创建的zip文件中的显示位置.既然你希望jar文件出现在zip文件的根目录下,你不需要指定它,并且可以将其保留(我不知道将它设置为"/"的效果是什么,我认为省略它会更安全.

您的问题似乎是您的库存储在您的lib目录下的子目录中,但您希望它们直接位于zip文件的根目录中.与任务不同,'zip'任务copy不直接接受映射器来更改文件在zip中的显示方式,但如果您使用的是Ant 1.7或更高版本,它将接受资源收集.你可以使用mappedresources带a fileset和a 的元素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>
Run Code Online (Sandbox Code Playgroud)

这意味着您不必先使用copy将罐子放入临时区域.