2016-08-17 2 views
0

Ich versuche, ein Glas mit Abhängigkeiten zu laufen. Die Anwendung läuft gut in IntelliJ, aber wenn ich versuche, das Glas zu laufen bekomme ich:NoClassDefFoundError in jar aber nicht in Intellij

>> java -jar test-0.1.0.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: com/atlassian/httpclient/apache/httpcomponents/DefaultHttpClient 
     at com.atlassian.jira.rest.client.internal.async.AsynchronousHttpClientFactory.createClient(AsynchronousHttpClientFactory.java:53) 
     at com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory.create(AsynchronousJiraRestClientFactory.java:35) 
     at com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory.createWithBasicHttpAuthentication(AsynchronousJiraRestClientFactory.java:42) 
     at Main.main(Main.java:19) 
Caused by: java.lang.ClassNotFoundException: com.atlassian.httpclient.apache.httpcomponents.DefaultHttpClient 
     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) 
     ... 4 more 

Mein build.gradle sieht wie folgt aus:

group 'test' 
version '1.0-SNAPSHOT' 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.9' 
    distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip" 
} 

apply plugin: 'java' 
apply plugin: 'idea' 
apply plugin: 'application' 

sourceCompatibility = 1.8 

mainClassName = "Main" 

repositories { 
    mavenCentral() 
    maven { 
     url 'https://maven.atlassian.com/content/repositories/atlassian-public/' 
    } 
} 

jar { 
    baseName = 'test' 
    version = '0.1.0' 

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

    manifest { 
     attributes 'Main-Class': 'Main' 
    } 
} 

dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.11' 

    compile 'com.atlassian.jira:jira-rest-java-client-parent:4.0.0' 
    compile 'com.atlassian.jira:jira-rest-java-client-core:4.0.0' 
    compile 'com.atlassian.jira:jira-rest-java-client-api:4.0.0' 
    compile 'com.atlassian.jira:jira-rest-java-client-plugin:3.0.0' 
    compile 'com.atlassian.fugue:fugue-parent:2.6.1' 
    compile 'com.atlassian.fugue:fugue:2.6.1' 
} 

Ich habe auch versucht transitive=true zu jedem kompilieren Klausel hinzugefügt umsonst.

Antwort

0

Sie müssen set CLASSPATH

Der Klassenpfad ist der Pfad, der die Java-Laufzeitumgebung sucht nach Klassen und andere Ressourcendateien. Der Klassensuchpfad (besser unter dem kürzeren Namen "Klassenpfad" bekannt) kann mithilfe der Option -classpath beim Aufrufen eines JDK-Tools (der bevorzugten Methode) oder durch Festlegen der Umgebungsvariablen CLASSPATH festgelegt werden. Die Option -classpath wird bevorzugt, da Sie sie für jede Anwendung einzeln festlegen können, ohne andere Anwendungen zu beeinflussen und ohne dass andere Anwendungen ihren Wert ändern.

UPDATE:

standardmäßig Gradle nicht Abhängigkeiten kopieren Ordner erstellen oder schließen ihn in das Glas. Es gibt drei Möglichkeiten, das Problem mit Abhängigkeiten zu lösen:

  1. Downloaden Sie sie separat und in das entsprechende Verzeichnis.
  2. Verwenden Sie Plugins, um Fettglas zu bauen. So etwas wie shadow.
  3. Zum Build.Gradle-Task hinzufügen, der Abhängigkeiten in Build-Ordner kopiert.

Zum Beispiel

task copyDependencies(type: Copy) { 
    into "$buildDir/libs" 
    from configurations.runtime 
} 
+0

Hallo, vielen Dank. Können Sie ein konkretes Beispiel geben? Jetzt mache ich 'java -jar test-0.1.0.jar'. Sollte es 'Java-Klassenpfad sein. -jar build \ libs \ test-0.1.0.jar'? –

+0

Ja, wenn alle Abhängigkeiten in demselben Ordner sind. –

+0

Tut mir leid, es funktioniert nicht. –

Verwandte Themen