对于一个java项目,我希望将它所依赖的所有第三方jar合并到Apache Ant创建的主jar中,我已经做到了这一点。
问题是其中一些jar文件在它们的META-INF
-directories中有签名文件,所以当我尝试运行我的jar文件时,我得到了错误消息"Invalid signature file digest for Manifest main attributes"
。在我手动删除签名文件之后,错误就消失了。
我试图用excludes
-attribute或exclude
-tag在我的ant文件中过滤出签名文件,但似乎没有任何效果。
这是ant-task:
<target name="jar" description="Creates the jar file">
<mkdir dir="${jar}"/>
<jar destfile="${jar}/${ant.project.name}.jar" level="9" filesetmanifest="mergewithoutmain">
<zipgroupfileset dir="${lib}" includes="*.jar"/>
<zipfileset dir="${class}"/>
<manifest>
<attribute name="Main-Class" value="${mainclass}"/>
</manifest>
</jar>
</target>
在这个ant-task中,我如何从结果jar中过滤文件?谢谢你的帮忙!
发布于 2009-08-14 01:22:49
据我所知,在使用时没有过滤的方法:这里使用的include/excludes适用于要合并的zip,而不是其中的内容。
如果您有一组广为人知的JAR要合并,那么您可以对每个JAR使用单独的条目;这种方法允许使用include/exclude来过滤源存档的内容。
另一种方法是简单地将所有内容解压缩到一个临时位置,删除/修改不需要的部分,然后将所有内容压缩回去。
发布于 2010-03-11 23:32:44
carej是对的。我一直在尝试这样做,将其他jar合并到我的应用程序jar中,但不能使用<zipgroupfileset>
。
我的解决方案是unzip/clean-up/jar方法的一个变体:我首先使用<zipgroupfileset>
将所有外部库jar合并为一个库jar,然后使用允许过滤的<zipfileset>
将其合并到我的库中。在我的例子中,它的运行速度比将文件解压缩到磁盘上的速度快得多,而且更干净:
<jar jarfile="${dist}/lib/external-libs.jar">
<zipgroupfileset dir="lib/">
<include name="**/*.jar"/>
</zipgroupfileset>
</jar>
<sleep seconds="1"/>
<jar jarfile="${dist}/lib/historadar-${DSTAMP}.jar" manifest="Manifest.txt">
<fileset dir="${build}" includes="**/*.*"/>
<zipfileset src="${dist}/lib/external-libs.jar">
<exclude name="*"/>
</zipfileset>
</jar>
第一个构建将它在lib/中找到的所有jars放入external-libs.jar中,然后我让它等待一秒钟,以避免收到关于将来有修改日期的文件的警告,然后我将<jar>
/目录中的类文件与external-libs.jar的内容合并,排除其根目录中的文件,在本例中是自述文件和示例。
然后,我有了自己的自述文件,其中列出了我在应用程序中包含的库所需的所有信息,如许可证、网站等。
发布于 2012-12-28 02:11:58
您可以使用zipfileset
标记中的exclude
参数从合并的外部JAR文件中删除内容,如下所示:
<jar jarfile="${dist}/lib/external-libs.jar">
<zipgroupfileset dir="lib/" excludes="META-INF/**/*">
<include name="**/*.jar"/>
</zipgroupfileset>
</jar>
生成的JAR文件将是未签名的。
https://stackoverflow.com/questions/1274879
复制相似问题