我在/libs/中有一些jar文件,我的项目类位于/target/。删除对外部文件夹的依赖关系。我想制作一个合并jar文件。它包含所有/libs/*.jar 中的jar文件中的所有类
我正在使用以下Ant脚本:
<jar destfile="mytest.jar" basedir="target/classes">
<manifest>
<attribute name="Main-Class" value="com.mytest.MyProcessor"/>
</manifest>
<fileset dir="target/classes" includes="**/*.class"/>
<zipgroupfileset dir="libs" includes="*.jar"/>
</jar>
但是,当我使用"java-jarmytest.jar"命令运行jar时,它会说:
线程"main"java.lang.SecurityException中的异常:签名文件条目javax/mail/internet/ContentDispositon.class没有manifest部分位于sun.security.util.SignatureFileVerifier.verifySection(未知源)位于sun.security.util.SignatureFileVerifier.processImpl(未知源)
如果有任何想法,如何制作一个没有此类问题的合并jar,我们将不胜感激。我正在使用IntelliJ IDEA。
线程"main"java.lang.SecurityException中的异常:签名文件条目没有manifest部分
这个错误消息告诉为什么捆绑jar不推荐用于生产发布。问题是你的一些依赖jar是用签名文件签名的。重新打包它可能会违反依赖jar上的一些安全策略。
为了使它发挥作用,您需要从已签名的jar中删除所有签名文件,然后将未打包的文件复制到最终的构建jar文件中。注意<zip组文件集>不支持在jar归档中排除文件,请尝试使用<zip文件集>相反:
<zipfileset src="libs/mail.jar">
<exclude name="**/*.RSA, **/*.SF, **/*.DSA"/>
</zipfileset>
... ...
这样的东西可能对你有用。
<jar destfile="mytest.jar" basedir="target/classes">
<restrict>
<not>
<or>
<name name="**/*.RSA"/>
<name name="**/*.SF"/>
<name name="**/*.DSA"/>
</or>
</not>
<archives>
<zips>
<fileset dir="libs" includes="**/*.jar"/>
</zips>
</archives>
</restrict>
<manifest>
<attribute name="Main-Class" value="com.mytest.MyProcessor"/>
</manifest>
</jar>
我根据http://ant.apache.org/manual/Tasks/jar.html在"合并档案"部分。
使用Maven和shade插件。看看http://maven.apache.org/plugins/maven-shade-plugin/
我建议将所有jar文件解压缩到lib文件夹中,然后与源代码一起进行jar,尝试一下它可能对您有用。