19

我想解压缩多个 JAR 文件,然后使用 ant 构建脚本重建为一个 JAR。这可能吗?

4

4 回答 4

14

是的,蚂蚁可以。jar 文件基本上是一个带有特殊清单文件的 zip。所以要解压,我们需要解压罐子。Ant 包含一个解压缩任务。

解压缩/解压缩项目中的所有 jar 文件:

<target name="unjar_dependencies" depends="clean">
    <unzip dest="${build.dir}">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar" />
        </fileset>    
    </unzip>
</target>

显然你需要先声明 ${build.dir} 和 ${lib.dir} 。该行<include name="**/*.jar" />告诉 ant 包含所有以 jar 扩展名结尾的文件,您可以调整该包含以满足您的需要。

要将所有内容打包到 jar 中,请使用jar任务:

<target name="make_jar" depends="compile, unjar_dependencies">
    <jar basedir="${build.dir}"
         destfile="${dist.dir}/${project_name}.jar">
        <manifest>
            <attribute name="Main-Class" value="${mainclass}" />
        </manifest>
        <fileset dir="${build.dir}">
            <include name="**/*.class" />
        </fileset>
        <fileset dir="${src.dir}">
            <include name="applicationContext.xml" />
            <include name="log4j.properties" />
        </fileset>
    </jar>
</target>

在此示例中,我们包含不同的文件集。在一个文件集中,我们包含所有已编译的类。在另一个文件集中,我们包含了这个特定项目所依赖的两个配置文件。

于 2010-05-12T22:35:14.787 回答
7

是的 !

你有两种可能:

  • 埃斯彭回答:

一种可能的解决方案是从给定目录中的所有 jar 文件创建一个 jar 文件:

<target name="dependencies.jar">
    <jar destfile="WebContent/dependencies.jar">
        <zipgroupfileset dir="lib/default/" includes="*.jar" 
              excludes="*.properties" />
    </jar>
</target>

如果您不需要排除某些 jar 中的内容(例如某些可能覆盖您的属性配置文件等),这将非常有用。这里的 excludes 属性是从 dir 属性中过滤掉文件。

  • 使用 zipfileset

另一种解决方案是使用 zipfileset 标签,这次 excludes 属性将过滤掉要合并的 jar 中的内容。

<jar destfile="your_final_jar.jar" filesetmanifest="mergewithoutmain">
    <manifest>
        <attribute name="Main-Class" value="main.class"/>
        <attribute name="Class-Path" value="."/>
    </manifest>
    <zipfileset 
       excludes="META-INF/*.SF"
       src="/path/to/first/jar/to/include.jar"/>
</jar>
  • 当然,您可以将两个标签(zipfileset 和 zipgroupfileset)组合在同一个 jar 标签内,以充分利用两者。
于 2010-05-12T22:35:50.833 回答
3

是的,这是可能的。

一种可能的解决方案是从给定目录中的所有 jar 文件创建一个 jar 文件:

<target name="dependencies.jar">
    <jar destfile="WebContent/dependencies.jar">
        <zipgroupfileset dir="lib/default/" includes="*.jar" 
              excludes="*.properties" />
    </jar>
</target>
于 2010-05-12T22:49:51.777 回答
0

还有一个专门用于重新打包 jar 的项目,称为JarJar。您可以使用它将多个 Jar 重新打包为一个。根据您的要求,您甚至可以重命名类以防止版本冲突。

从他们的入门页面

在此示例中,我们包含来自 jaxen.jar 的类,并添加一条规则,将任何以“org.jaxen”开头的类名更改为以“org.example.jaxen”开头(在我们想象的世界中,我们控制 example.org 域) :

<target name="jar" depends="compile">
    <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"
        classpath="lib/jarjar.jar"/>
    <jarjar jarfile="dist/example.jar">
        <fileset dir="build/main"/>
        <zipfileset src="lib/jaxen.jar"/>
        <rule pattern="org.jaxen.**" result="org.example.@1"/>
    </jarjar>
</target>
于 2013-11-18T16:17:53.957 回答