我想解开多个JAR文件,然后使用ant构建脚本重建为一个JAR。这可能吗?
答案 0 :(得分:14)
是的,这可能与蚂蚁有关。 jar文件基本上是带有特殊清单文件的zip。因此,为了解开,我们需要解压缩罐子。 Ant包含unzip任务。
解压缩/解开项目中的所有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>
在此示例中,我们包含不同的文件集。在一个文件集中,我们包括所有已编译的类。在另一个文件集中,我们包含了这个特定项目依赖的两个配置文件。
答案 1 :(得分:7)
是的!
您有两种可能性:
创建一个可能的解决方案 来自所有jar文件的jar文件 给定目录:
<target name="dependencies.jar">
<jar destfile="WebContent/dependencies.jar">
<zipgroupfileset dir="lib/default/" includes="*.jar"
excludes="*.properties" />
</jar>
</target>
如果您不需要排除某些jar中的内容(例如某些属性配置文件可能会覆盖您的内容等),这将非常有用。这里排除的属性是从dir属性中过滤掉文件。
另一个解决方案是使用zipfileset标记,这次排除属性将过滤掉要合并的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>
答案 2 :(得分:3)
是的,这是可能的。
一种可能的解决方案,从给定目录中的所有jar文件创建一个jar文件:
<target name="dependencies.jar">
<jar destfile="WebContent/dependencies.jar">
<zipgroupfileset dir="lib/default/" includes="*.jar"
excludes="*.properties" />
</jar>
</target>
答案 3 :(得分:0)
还有一个专门用于重新包装罐子的项目JarJar。您可以使用它将多个罐子重新包装成一个。根据您的要求,您甚至可以重命名类以防止版本冲突。
在这个例子中,我们包含了来自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>