NoClassDefFoundError zur Laufzeit mit Gradle
Ich bin mit gradle als die JavaFX-plugin.
Alles funktioniert perfekt, sogar nach dem Bau und der runnig excecutable bei Verteilung/, außer mit einer Klasse: CloseableHttpClient
Für verschiedene Zwecke, ich erstelle das Objekt so:
CloseableHttpClient client = HttpClients.createDefault();
Läuft das Programm in der IDE ist kein problem, funktioniert alles einwandfrei. Aber wenn ich aufbauen und versuchen, die .exe-Datei erhalte ich folgende Throwable
-StackTrace:
java.lang.NoClassDefFoundError: Could not initialize class org.apache.http.conn.ssl.SSLConnectionSocketFactory
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
at ch.itcb.tools.lom.util.JsonSimpleUtil.http(JsonSimpleUtil.java:29)...
Ich wirklich nicht verstehen. Wie kann es sein, dass nur diese Klasse nicht gefunden, aber alle meine anderen Klassen zu tun?
Meine bauen.gradle-Datei:
apply plugin: 'java'
apply plugin: 'eclipse'
apply from: 'javafx.plugin'
sourceCompatibility = 1.8
version = '0.1'
jar {
manifest {
attributes 'Implementation-Title': 'LogoffManager',
'Implementation-Version': version
}
}
repositories {
mavenCentral()
}
dependencies {
compile fileTree(dir: 'lib', include: ['*.jar'])
compile 'ch.qos.logback:logback-classic:1.1.3'
compile 'org.apache.httpcomponents:httpclient:4.5.1'
compile 'com.googlecode.json-simple:json-simple:1.1'
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
test {
systemProperties 'property': 'value'
}
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
Schreiben Sie bitte einen Kommentar, wenn Sie weitere Informationen benötigen. Thx.
- Bitte teilen Sie Ihre bauen.gradle-Datei.
- getan. immer noch keine Lösung gefunden :/
- Apache jar in der distribution? Enthält es die fehlende Klasse?
- ja, es funktioniert. kann nicht glauben, dass es von mir selbst.
- Keine weitere Hilfe? Kämpfen immer noch mit dem gleichen problem..
- Hast du eine Lösung finden? würden Sie teilen? tnks
Du musst angemeldet sein, um einen Kommentar abzugeben.
es ist eine gute Frage, die ich gestoßen bin, gerade jetzt während der Recherchen für Beispiele der vielen Möglichkeiten für Java-Entwickler kann am Ende mit der Klasse Weg Spaß 🙂
Ich begann mit einer minimal-version des builds.gradle (darunter nur das, was unmittelbar relevant sind), insbesondere:
Meiner 'Main' - Klasse, die in diesem Zusammenhang verwendet Ihre code-Beispiel, also:
In diesem Stadium, ich kann laufen
gradle clean build
gefolgt vonjava -jar build/libs/33106520.jar
(mein Projekt erhielt den Namen nach dieser StackOverflow-Frage) und ich sehe das:Ist dies etwas anders aus Ihre Fehler, aber bevor wir zu Graben und zu reproduzieren, lassen Sie mich etwas konkretisieren: beide dieser Fehler und die, die Sie sehen, verursacht werden, zur Laufzeit, wenn der classloader nicht in der Lage ist zu finden, eine Klasse, die es braucht. Es ist ein ziemlich guter blog-post hier mit einigen mehr details über den Unterschied zwischen compile-Zeit-und runtime-classpath klassenpfade.
Wenn ich
gradle dependencies
ich sehen kann, die runtime-Abhängigkeiten für mein Projekt:Fügte ich diese manuell, one-by-one zu meinem runtime-classpath. (Für das Protokoll, dies ist nicht allgemein als gute Praxis, aber zum Wohle des Experiments, kopierte ich diese Gläser zu meiner
build/libs
Ordner und lief mitjava -cp build/libs/33106520.jar:build/libs/* com.oliverlockwood.Main
. Interessant genug, das war nicht in der Lage zu reproduzieren Sie Ihr problem genauer. Zur Erinnerung:org.apache.httpcomponents:httpclient
zur Laufzeit verfügbar, dann werden wir scheitern, weil dieHttpClients
jar wird nicht gefunden.org.apache.httpcomponents:httpclient:4.5.1
zur Laufzeit verfügbar, dann ist dein problem nicht manifestieren - und ich beachten Sie, dass die Klasse Ihr zu bauen, nicht finden (org.apache.http.conn.ssl.SSLConnectionSocketFactory
) ist Teil dieser gleichen Apache-Bibliothek, das ist in der Tat sehr verdächtig.Mein Verdacht ist dann, dass Ihre runtime-classpath enthält eine andere version des Apache httpclient library. Da gibt es eine ganze lotta-Versionen gibt, werde ich nicht testen jeder einzelnen Kombination, also werde ich Sie stattdessen verlassen Sie mit den folgenden Rat.
compile fileTree(dir: 'lib', include: ['*.jar'])
. Verwaltet Abhängigkeiten basiert auf einem repository, wie Maven oder JCenter sind viel einfacher, mit zu arbeiten konsequent als Abhängigkeiten in einer random-Verzeichnis. Wenn diese internen Bibliotheken, die Sie nicht veröffentlichen möchten, um eine open-source-Artefakt-repository, dann kann es sich lohnen, eine lokale Instanz Nexus oder ähnliches.build.gradle
, und läuftgradle clean shadow
ich war in der Lage zu laufenjava -jar
just fine, ohne dass manuell etwas hinzufügen, um mein classpath.java.lang.NoClassDefFoundError: org/apache/http/config/Lookup
. Ich habe immer wieder nachgeschaut, ob dieser Klasse in Apache Http Gläser (httpclient, httpcore) unterMaven Dependencies
in Eclipse und konnte Sie nicht finden. Klar, dass maven wählte, um einige der anderen version vonhttpcore
von parent-POM statthttpcore
- version, die eine direkte Abhängigkeit derhttpclient
.Hatte zu geben eine explizitehttpcore
version entspricht der version, die der version der direkten Abhängigkeit vonhttpclient
.gradle dependencies
erzeugt eine Meldung:A web-based, searchable dependency report is available by adding the --scan option.
Undgradle build --scan
produziert eine öffentlich durchsuchbaren Bericht mit deps, die Sie löschen können, wenn Sie fertig.NoClassDef*
.