【问题标题】:Ant: Create tar without path information?Ant:创建没有路径信息的tar?
【发布时间】:2010-07-24 03:38:55
【问题描述】:

更新:我在 Windows XP 上使用 Ant 1.8.1。

我正在尝试为多个项目编写 Ant 主构建文件。我可以为每个项目成功创建一个 jar,并且我想将所有这些 jar 打包到一个 tar.gz 文件中。每个 jar 文件都位于其各自项目的 bin 子目录中,但将来可能会更改此路径。我尝试过这样的事情:

<tar destfile="foo.tar.gz" compression="gzip" >
   <tarfileset dir=".">
      <include name="**/*.jar" />
   </tarfileset>
</tar>

...哪种有效。唯一的问题是它维护了 jar 中的目录结构。我想要一个平面文件。所以而不是:

foo.tar.gz
   project1
      bin
         project1.jar
   project2
      bin
         project2.jar
etc...

我需要:

foo.tar.gz
   project1.jar
   project2.jar

我尝试使用 Ant 的复制任务将这些 jar 文件复制到一个临时目录,然后从那里 tar。但是,复制操作会复制目标目录中的路径。所以,同样的问题。

【问题讨论】:

    标签: java ant jar tar


    【解决方案1】:

    我想你快到了,你已经组装了一个扁平的文件目录。剩下的就是去掉 tarfileset 元素,该元素专门用于保留/插入结构。我认为tarzip 任务与嵌入的fileset 元素配合得很好。

    文档证明了这一点 - 直到 1.7 fileset 是可以用来代替 tarfileset 的嵌入式资源元素。

    想一想,我认为一旦切换到fileset,您可能不再需要临时复制文件以进行展平。


    编辑:

    我刚刚构建并运行了这个构建文件:

    <project name="tartest" default="teer">
       <target name="teer">
          <tar destfile="tartest.tar">
         <fileset dir="../Downloads" includes="*.ico *.gif"/>
          </tar>
       </target>
    </project>
    

    并且存档中没有原始目录的痕迹:

    -rw-r--r-- 0/0            3487 2009-12-28 20:04 actor075_thumb.gif
    -rw-r--r-- 0/0            1456 2010-06-16 10:57 bea-logo.gif
    -rw-r--r-- 0/0           23800 2010-06-16 09:22 ejb1.gif
    -rw-r--r-- 0/0            1406 2010-05-15 10:40 favicon-beta.ico
    -rw-r--r-- 0/0            1406 2010-05-15 10:25 favicon-clown.ico
    -rw-r--r-- 0/0            1406 2008-12-06 01:08 favicon.ico
    

    另外,tar -xvf tartest.tar 转储了我当前目录中的 tar 文件。

    那么...你做了什么不同的事情导致了不同的结果?


    编辑 2:

    通过重新阅读您的问题获得更多见解。我完全避开了**/* 通配符生成的源路径问题。

    由于您已经在考虑将这些 jar 文件复制到临时目录,因此缺少的只是在 copy 任务上使用 flatten 属性。那应该可以解决您的问题。

    【讨论】:

    • 我尝试切换到文件集而不是 tarfileset,但结果相同。
    • 对于迄今为止所有不相关的建议和 cmets,我深表歉意。我相信我的第二次更新现在有你需要的信息。
    • 谢谢!展平工作。我使用 将所有 jar 文件复制到一个临时目录并从那里将它们压缩。
    【解决方案2】:

    你可能想看看 Ant 的flattenmapper

    【讨论】:

    • 我也看过了,但在某些地方,ant 的文档太神秘,无法帮助使用这些功能。我无法理解如何在tar 任务中使用flattenmapper,所以我选择了使用copyflatten 属性的更简单的解决方案。您是否知道有关 ant 任务的更多有用文档?
    • 我忘了,它应该是这样工作的,但由于某种原因,Ant 不允许您将映射器与 tar 任务一起使用。您最终必须事先以大致相同的布局构建文件。
    【解决方案3】:

    您也许可以使用zipFileSet 来完成此操作。它允许您控制提供您自己的前缀(或无前缀)的整体结构。

    <zip destfile="${dist}/product.zip">
        <zipfileset dir="bin/project1.jar" prefix="any/fake/path/you/want"/>
        <zipfileset dir="bin/project2.jar" prefix="any/fake/path/you/want"/>
        <zipfileset dir="some/other/path/project3.jar" prefix="any/fake/path/you/want"/>
    </zip>
    

    将导致:

    any/fake/path/you/want/project1.jar
    any/fake/path/you/want/project2.jar
    any/fake/path/you/want/project3.jar
    

    【讨论】:

    • 我必须使用像“*/.jar”这样的通配符,因为我有多个子项目(将来还会添加更多子项目)。我需要使其通用,而不是手动将每一个添加到构建文件中。我尝试创建一个 zip 文件,它与我在上面放置的原始 tar 版本几乎相同。结果是一样的。我尝试使用前缀属性,但它只是将文件的相对路径附加到我提供的前缀。例如。 prefix="test/out/" 将在存档中创建文件,路径为“test/out/project1/bin/project1.tar”等。
    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2011-07-04
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多