読者です 読者をやめる 読者になる 読者になる

ゲンゾウ用ポストイット

Java、Groovy、Linux関連の備忘録

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