fat jar作成後にInvalidsignaturefileがどうのこうの言われる時の対処

Gradle, Groovy

既存の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から、不要ファイルを除外しておかないとダメみたい。

Gradle, Groovy

Posted by genzouw