I have some jar files into /libs/ and my project classes are located at /target/. To remove dependency on external folder. I want to make a consolidate jar file. Which contains all the classes from jar files found in all /libs/*.jar
I am using following Ant script:
<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>
But, when I run the jar using "java -jar mytest.jar" command, it says:
Exception in thread "main" java.lang.SecurityException: no manifiest section for signature file entry javax/mail/internet/ContentDisposition.class
at sun.security.util.SignatureFileVerifier.verifySection(Unknown Source)
at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)
Any idea, how to make a consolidated jar that have no such issues, would be highly appreciated. I am using IntelliJ IDEA.
Exception in thread "main" java.lang.SecurityException: no manifiest section for signature file entry
This error message tells exactly why bundled jar is not recommended for production release. The problem is some of your dependency jar is signed with signature files. repack it may violate some security policy on the dependency jar.
To make it work, you need remove all signature files from the signed jar, before copying the unpacked files into your final build jar file. Note that <zipgroupfileset> doesn't support exclude file within jar archive, try using a list of <zipfileset> instead:
<zipfileset src="libs/mail.jar">
<exclude name="**/*.RSA, **/*.SF, **/*.DSA"/>
</zipfileset>
... ...
Something like this might work for you.
<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>
I adapted this from the example at http://ant.apache.org/manual/Tasks/jar.html under the "Merging archives" section.
Use Maven and the shade plugin. Have a look at http://maven.apache.org/plugins/maven-shade-plugin/
I would suggest to unjar all your jar files into a lib folder and then jar together with your your source code, try it might work for you.