2010-05-12 27 views

回答

14

是的,它可能与蚂蚁。 jar文件基本上是一个带有特殊清单文件的zip文件。所以为了unjar,我们需要解压罐子。 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任务:

<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> 

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

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

另一个解决办法是使用zipfileset标签,其中不包括财产这次从里面过滤出的内容将被合并。

<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标签内得到最好的两个。
3

是的,这是可能的。

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

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

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

从他们getting started page

在这个例子中,我们包括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="[email protected]"/> 
    </jarjar> 
</target> 
相关问题