web-dev-qa-db-ja.com

Gradle-FatJar-メインクラスが見つからなかったか、ロードできませんでした

私はその質問がたくさん尋ねられ、多くの答えがあることを知っていますが、それでも私はそれを理解し、なぜその理由がわかりません...

Gradleとの依存関係を持つプロジェクトから.jarを生成しようとしています。

クラスsrc/main/Java/Launcher.Javaがあり、その中にmainメソッドがあります。

私のbuild.gradleがあります

plugins {
    id 'Java'
    id 'application'
}

version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
mainClassName = 'Launcher'

repositories {
    mavenCentral()
}

dependencies {
    compile 'commons-io:commons-io:2.1'
    compile 'io.vertx:vertx-core:3.4.0'
    compile 'io.vertx:vertx-web:3.4.0'
    compile 'com.google.code.gson:gson:1.7.2'
    compile "com.auth0:Java-jwt:3.1.0"
    compile 'org.mongodb:mongo-Java-driver:3.4.1'
    compile 'com.google.guava:guava:24.1-jre'
    compile 'commons-io:commons-io:2.6'
}

jar {
    manifest {
        attributes "Main-Class": mainClassName
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

私は$>gradle assembleを使用してjarを生成し、次に$>Java -jar path/to/my/.jarを使用すると、「メインクラスLauncherが見つからないか、ロードできませんでした」というエラーが表示されます...

理由がわかりません。jarを見るとLauncherクラスがあり、META-INFにはマニフェストがあります。

screenshot

2018年もこの質問をすることは申し訳ありませんが、何が問題なのかを理解しようとしています。 somoneが答えてくれることを願っています。

13
Hadrien

問題をローカルで再現しました。

exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'をjarタスクに追加するだけです。

これにより、干渉する依存関係のシグネチャが除外されます。

13

FAT JARをビルドするときに、1つの大きな問題に直面しています。

ソースJARの1つに署名があり、それを1つの太いjarにマージすると、署名が破棄されます。

Javaは、署名されていないクラスがあることを認識し、署名されたクラス以外はすべて無視します。署名されたライブラリに属していないすべてのクラスは署名されていないため(Launcherクラスなど) )それらは無視されるため、ロードできません。

あなたの場合、依存関係はorg.bouncycastle:bcprov-jdk15on:1.55/com.auth0:Java-jwt:3.1.0は、署名されたjarファイルです。私のサンプルプロジェクトでは、この依存関係のコメントを外すとLauncherが正しく実行されるためです。

Bouncy Castleは、有効な署名が必要な暗号プロバイダーです。それ以外の場合は、私の経験では動作しません。したがって、すべてのクラスのみを含むプロジェクトのファットjarを作成することは不可能です。

Bouncycastleを除くすべてのものを使用して太いjarファイルを作成し、Bouncycastle JARを個別に出荷することができます。

または、内部に必要なすべてのJARファイル(JAR内のJAR)を含み、JAR内のそのようなJAR内からクラスをロードできる特別なクラスローダーを使用する太いjar。例を参照してください: https://stackoverflow.com/a/33420518/150978

5
Robert

.SF .DSA .RSAファイルを除外してみてください。以下の例では、Nipun

これがあなたのためにうまくいくことを願っています

task customFatJar(type: Jar) {
  baseName = 'XXXXX'
  from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
  }
  with jar

  exclude "META-INF/*.SF"
  exclude "META-INF/*.DSA"
  exclude "META-INF/*.RSA"

  manifest {
    attributes 'Main-Class': 'com.nipun.MyMainClass'
  }
}
2
Nipun