使用ant创建一个包含JAR、库和文档的可分发zip文件



我有一个库,它通常通过手工制作JAR及其依赖项及其javadoc的zip文件来分发。我想在ant中自动执行此任务。

对于这个发行版的预期用例来说,一个奇怪的地方是,当它被解包时,我的团队创建的JAR和任何库JAR都应该在相同的路径中。我们不能让myproject.zip/the.jarmyproject.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="/">库,但没有如预期的那样工作。

zipfilesetprefix属性用于描述文件在创建的zip文件中应该出现的位置。由于您希望jar文件出现在zip文件的根目录,因此不需要指定它,并且可以省略它(我不确定将其设置为"/"会产生什么效果,我认为省略它会更安全)。

您的问题似乎是,您的库存储在lib目录下的子目录中,但您希望它们直接在zip文件的根目录中。与copy任务不同,'zip'任务不接受映射器来直接更改文件在zip中的显示方式,但如果您使用ant 1.7或更高版本,它将接受资源集合。你可以使用mappedresources元素与filesetflattenmapper来获得你想要的效果:

<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应该可以做到这一点;我还没有试过……

相关内容

  • 没有找到相关文章

最新更新