【问题标题】:Need an ANT task to include a set of jar files in the final jar's /lib dir需要一个 ANT 任务来在最终 jar 的 /lib 目录中包含一组 jar 文件
【发布时间】:2013-04-29 06:05:45
【问题描述】:

我的项目文件夹中有一堆依赖的jar:

/lib/someapi-1.1.1/main.jar
/lib/someotherapi-2.2.2/api-2.2.2.jar
/lib/...

我构建了一个 JAR 文件,我的应用程序要求将依赖的 jar 包含在 jar 内 /lib 文件夹中的最终 jar 中,因此最终 jar 应该具有类似以下的结构:

/org/me/myclasses.class
/lib/main.jar
/lib/api-2.2.2.jar

如何将 /lib/*.jar 文件扁平化并包含在最终 jar 文件的 /lib 目录中?


澄清

我实际上只是想将一组资源文件展平并添加到我最终 jar 中的给定目录中。

【问题讨论】:

  • 我真的不需要 one-jar 的可执行功能和自定义类加载器,我在这里使用 Hadoop,并且该应用程序已经处理解压 jar 文件的 /lib 目录并将它们添加到它的自己的类路径。我只需要将文件压缩到/lib,我可以手动完成,但我想自动化它。
  • 是的,但我不知道如何获取我想要展平的文件并添加到我的 jar 中的指定路径。

标签: java ant jar


【解决方案1】:

如果您想跳过复制步骤,您可以这样做。它使用<mappedresources>从源lib目录展平到classes/lib区域。

<jar destfile="${dist}/MyOneBigJar.jar">
    <fileset dir="${classes}"/>
    <mappedresources>
      <fileset dir="lib">
          <include name="**/*.jar" />
      </fileset>
      <chainedmapper>
          <flattenmapper />
          <globmapper from="*" to="classes/lib/*" />
      </chainedmapper>
    </mappedresources>
</jar>

【讨论】:

    【解决方案2】:

    我看到的最简单的方法是使用copy 任务及其flatten 属性将所有jar 复制到一个临时文件夹,并将这个临时目录的jar 包含到目标jar 中。


    提问者添加的附加细节

    这是最终的 ANT 目标的样子(供将来参考):

      <target name="dist">
        <mkdir dir="${classes}/lib"/>
        <copy flatten="true" todir="${classes}/lib" includeemptydirs="false">
            <fileset dir="lib">
                <include name="**/*.jar" />
            </fileset>
        </copy>
        <jar destfile="${dist}/MyOneBigJar.jar">
            <fileset dir="${classes}"/>
        </jar>
      </target>
    

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2010-10-31
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多