清洁方式结合多个罐子?最好使用Ant

Jac*_*cob 60 java ant jar

我有一些外部jar的运行时依赖项,我想"重新"到一个jar中.这些外部依赖项存储在external_jars目录中,我希望不必全部列出它们(即,如果我的依赖项发生更改,则不需要更改构建脚本).有什么想法吗?

谷歌给了我一个很好的答案,如何做到这一点 - 如果你不介意将每个jar列为依赖:

http://markmail.org/message/zijbwm46maxzzoo5

粗略地说,我想要的是下面的内容,它们将lib目录中的所有jar组合成out.jar(带有一些合理的覆盖规则).

jar -combine -out out.jar -in lib/*.jar
Run Code Online (Sandbox Code Playgroud)

nig*_*ale 66

弗拉基米尔的答案是正确的,但我觉得他的建议意味着重新包装一个大的out.jar中的所有罐子,然后将其作为单个<zipfileset>或类似的东西送到Ant Jar任务.这种两步法是不必要的.我不确定这是否与Ant版本有关,但我有Ant 1.7.1,它的<jar>任务理解<zipgroupfileset>,它允许直接提供第三方罐子的所有内容.

<jar destfile="MyApplication.jar">
  <zipgroupfileset dir="lib" includes="*.jar" /> 
  <!-- other options -->
  <manifest>
    <attribute name="Main-Class" value="Main.MainClass" />
  </manifest>
</jar>
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 57

只需使用zipgroupfilesetAnt Zip任务即可

<zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</zip>
Run Code Online (Sandbox Code Playgroud)

这将使所有包含的jar库内容变得扁平化.

  • 令我感到遗憾的是,所有工作的答案似乎都围绕着编写一个ant构建文件,而且没有一个涉及简单的命令行调用. (9认同)
  • 如果你在ant中执行它,那么你可以将它作为目标包含在构建脚本中,这可能是你想要的唯一一次. (2认同)

Sta*_*ale 23

你可以看看jarjar:

http://code.google.com/p/jarjar/

  • 卫生署!我调查了这个.它有许多高级功能,但事实证明我不需要它.缺少什么(至少从网站上的文档)是一个简单的方法来做类似的事情:jar -combine -out out.jar -in lib/*.jar这就是我需要的东西 (2认同)

Dav*_*ant 9

首先尝试将JAR解压缩到编组目录:

<target name="combine-jars">
    <mkdir dir="${marshall.dir}"/>
    <unzip dest="${marshall.dir}">
        <fileset dir="${external.jar.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </unzip>
    <jar destfile="${combined.jar}" basedir="${marshall.dir"}>
    <delete dir="${marshall.dir}"/>
</target>
Run Code Online (Sandbox Code Playgroud)

${marshall.dir}临时目录在哪里,${external.jar.dir}是您保留JAR的位置,并且${combined.jar}是目标JAR.

  • 前面的例子将在jar文件中包含其他jar -as jar! - .另一方面,这个将首先将所有jar放空到*.class文件,然后从所有类文件创建一个jar. (2认同)