2013-02-03 9 views
26

Ich habe ein lauffähiges Glas mit diesem build.gradlewie die Abhängigkeiten Bibliotheken JAR-Dateien in gradle kopieren

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

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld") 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile (
     'commons-codec:commons-codec:1.6', 
     'commons-logging:commons-logging:1.1.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpcore:4.2.1', 
     'org.apache.httpcomponents:httpmime:4.2.1', 
     'ch.qos.logback:logback-classic:1.0.6', 
     'ch.qos.logback:logback-core:1.0.6', 
     'org.slf4j:slf4j-api:1.6.0', 
     'junit:junit:4.+' 
    ) 
} 

aber es versäumt laufen, weil die Abhängigkeiten Gläser nicht finden können.

und dann füge ich diesen Code:

task copyToLib(type: Copy) { 
    into "$buildDir/output/libs" 
    from configurations.runtime 
} 

aber nichts ändern ... Ich kann nicht den Ordner Ausgang finden/libs ...

wie kann ich kopieren Sie die Abhängigkeiten Libs Gläser zu ein bestimmter Ordner oder Pfad?

+0

Wie führen Sie den Code? –

+0

@PeterNiederwieser Niederwieserfirst ich laufe: gradle build, bekomme die runnable jar Datei Dann starte die jar Datei: java -jar XXX.jar – jychan

+0

Du willst wahrscheinlich Sync anstelle von Copy verwenden. Siehe auch https://docs.gradle.org/current/userguide/working_with_files.html#sec:sync_task – morty

Antwort

1

Die Anwendung Plugin erfordert, dass Sie die Hauptklassennamen wie folgt festgelegt:

mainClassName = "com.test.HelloWorld" 

Sie, dass auf Ihrem Build-Skript hinzufügen müssen. Denken Sie daran, dass Sie, wenn Sie versuchen, Ihre Anwendung mit dem Befehl java auszuführen, auch den Klassenpfad mit -cp festlegen müssen.

Das Anwendungs-Plugin vereinfacht diesen Prozess, indem es die Aufgabe distZip bereitstellt. Wenn Sie diese Aufgabe ausführen, wird für Sie unter build/distributions eine vollständige Verteilung erstellt. Die Distribution enthält Startskripte und alle Abhängigkeiten. Die generierten Startskripte setzen bereits den Klassenpfad für Sie, damit Sie nicht mehr damit umgehen müssen.

31

Anzahl:

build.dependsOn(copyToLib) 

Wenn gradle build läuft, Gradle baut Aufgaben und unabhängig von Aufgaben hängen von ihm (von dependsOn erklärt). Ohne die Einstellung build.dependsOn(copyToLib) verknüpft Gradle die Kopieraufgabe nicht mit der Erstellungsaufgabe. So

:

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

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld") 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile (
     'commons-codec:commons-codec:1.6', 
     'commons-logging:commons-logging:1.1.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpcore:4.2.1', 
     'org.apache.httpcomponents:httpmime:4.2.1', 
     'ch.qos.logback:logback-classic:1.0.6', 
     'ch.qos.logback:logback-core:1.0.6', 
     'org.slf4j:slf4j-api:1.6.0', 
     'junit:junit:4.+' 
    ) 
} 

task copyToLib(type: Copy) { 
    into "$buildDir/output/libs" 
    from configurations.runtime 
} 

build.dependsOn(copyToLib) 
+0

Bei der SonarQube-Analyse wurde während des Javacode-AST-Scans ERROR/WARN - Klasse xx.yy.zz nicht gefunden. Um das zu beheben, musste ich "sonar.java.libraries" einstellen, das alle jar (Abhängigkeiten) enthält, die während der Kompilierung, testCompile, Laufzeit benötigt werden. Ich habe "from configurations.compile from configurations.testCompile from configurations.runtime" hinzugefügt. Ich habe alle Gläser im Ordner "build/dependent-jars". Einstellung sonar.java.libraries = build/dependent-jars/*. Jar Ich erhalte keinen Fehler. Danke, da Gradle seinen Cache außerhalb des Arbeitsbereichs behält, aber mit diesem Code konnte ich die .jar im Build-Ordner bekommen. –

10

finde ich die Anwendung Plugin viel zu umständlich und zu ausführlich in seiner Ausgabe. Hier ist, wie ich endlich ein Setup war ich glücklich mit, das heißt, erstellen Sie eine Verteilung Zip-Datei mit Abhängigkeits Gläsern im Unterverzeichnis /lib und fügen Sie alle Abhängigkeiten zu Class-Path Eintrag in der Manifest-Datei:

apply plugin: 'java' 
apply plugin: 'java-library-distribution' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'org.apache.commons:commons-lang3:3.3.2' 
} 

// Task "distZip" added by plugin "java-library-distribution": 
distZip.shouldRunAfter(build) 

jar { 
    // Keep jar clean: 
    exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF' 

    manifest { 
     attributes 'Main-Class': 'com.somepackage.MainClass', 
        'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ') 
    } 
    // How-to add class path: 
    //  http://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle 
    //  https://gist.github.com/simon04/6865179 
} 

Hosted als Kern here.

Das Ergebnis kann in build/distributions und die entpackten Inhalt so aussehen zu finden:

lib/commons-lang3-3.3.2.jar
MyJarFile.jar

Inhalt MyJarFile.jar#META-INF/MANIFEST.mf:

Manifest-Version: 1.0
Haupt-Klasse: com.somepackage.MainClass
Klassenpfad: lib/commons-lang3-3.3.2.jar

+1

Danke super Arbeit ma ' –

Verwandte Themen