fat jar作成後にInvalidsignaturefileがどうのこうの言われる時の対処
既存のJavaプロジェクトから、google:Gradle]を利用して[google:fat jarを作成してみた。
Cookbook - Gradle - Codehaus
ただし、swt関連のjarを含めたfat jarを実行すると以下のようなエラーが発生する場合がある。
Exception in thread "main" java.lang.SecurityException: Invalid signature file d igest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source) at sun.security.util.SignatureFileVerifier.process(Unknown Source) at java.util.jar.JarVerifier.processEntry(Unknown Source) at java.util.jar.JarVerifier.update(Unknown Source) at java.util.jar.JarFile.initializeVerifier(Unknown Source) at java.util.jar.JarFile.getInputStream(Unknown Source) at sun.misc.URLClassPath$JarLoader$2.getInputStream(Unknown Source) at sun.misc.Resource.cachedInputStream(Unknown Source) at sun.misc.Resource.getByteBuffer(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source)
以下のようにbuild.gradleの一部に不要ファイルを除去する設定を追記することで解決する。
変更前
jar { manifest { attributes( 'Implementation-Title': archivesBaseName , 'Implementation-Version': version , 'Main-Class': 'com.genzou.ExampleMain', ) } }
変更後
jar { manifest { attributes( 'Implementation-Title': archivesBaseName , 'Implementation-Version': version , 'Main-Class': 'com.genzou.ExampleMain', ) } doFirst { from (configurations.runtime.resolve().collect { it.isDirectory() ? it : zipTree(it) }) { exclude 'META-INF/MANIFEST.MF' exclude 'META-INF/*.SF' exclude 'META-INF/*.DSA' exclude 'META-INF/*.RSA' } } }
google:fat jar対象となるいくつかのjarから、不要ファイルを除外しておかないとダメみたい。
ディスカッション
コメント一覧
まだ、コメントがありません