私はその質問がたくさん尋ねられ、多くの答えがあることを知っていますが、それでも私はそれを理解し、なぜその理由がわかりません...
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にはマニフェストがあります。
2018年もこの質問をすることは申し訳ありませんが、何が問題なのかを理解しようとしています。 somoneが答えてくれることを願っています。
問題をローカルで再現しました。
exclude 'META-INF/*.RSA', 'META-INF/*.SF', 'META-INF/*.DSA'
をjarタスクに追加するだけです。
これにより、干渉する依存関係のシグネチャが除外されます。
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
.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'
}
}