2013-02-03 21 views
26

dostałem runnable słoik z tym build.gradlejak skopiować zależności bibliotek JAR w Gradle

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.+' 
    ) 
} 

ale go uruchomić nie powiodła się, ponieważ zależności słoiki nie mogą znaleźć.

a potem dodaj ten kod:

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

... ale zmiana nic nie mogę znaleźć wyjście folder/libs ...

jak mogę skopiować zależności libs do słoików określony folder lub ścieżka?

+0

Jak uruchomić kod? –

+0

@PeterNiederwieser Niederwieserfirst biegnę: Gradle kompilacji, uzyskać runnable pliku jar następnie uruchom plik jar: java -jar XXX.jar – jychan

+0

prawdopodobnie chcesz użyć Sync zamiast Kopiuj. Zobacz także https://docs.gradle.org/current/userguide/working_with_files.html#sec:sync_task – morty

Odpowiedz

1

Wtyczka aplikacja wymaga, aby ustawić główną nazwę klasy tak:

mainClassName = "com.test.HelloWorld" 

Trzeba dodać, że do skryptu build. Należy pamiętać, że jeśli spróbujesz uruchomić aplikację za pomocą komendy java, musisz również ustawić ścieżkę klasy przy pomocy -cp.

Wtyczka aplikacji upraszcza ten proces, udostępniając zadanie distZip. Jeśli uruchomisz to zadanie, utworzona zostanie pełna dystrybucja pod numerem build/distributions. Dystrybucja zawiera skrypty startowe i wszystkie zależności. Wygenerowane skrypty startowe już ustawiają ścieżkę klas, więc nie musisz już z nią radzić.

31

Dodaj:

build.dependsOn(copyToLib) 

Kiedy gradle build biegnie, Gradle buduje zadania i zadania niezależnie od tego zależy (deklarowane przez dependsOn). Bez ustawienia build.dependsOn(copyToLib), Gradle nie kojarzy zadania kopiowania z zadaniem kompilacji.

Więc:

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

W analizie SonarQube podczas skanowania AST w Javacode otrzymałem komunikat ERROR/WARN - nie znaleziono klasy xx.yy.zz. Aby to naprawić, musiałem ustawić "sonar.java.libraries", która zawiera wszystkie słoiki (zależności) wymagane podczas kompilowania, testowania, uruchamiania. Dodałem "from configurations.compile from configurations.testCompile from configurations.runtime". Mam wszystkie słoiki w folderze "build/dependent-słoiki". Ustawienie sonar.java.libraries = build/dependent-dependent/*. Jar Nie dostaję błędu. Dzięki, ponieważ gradle utrzymuje swoją pamięć podręczną poza obszarem roboczym, ale używając tego kodu, udało mi się uzyskać folder .jar in build. –

10

znajdę sposób plugin aplikacja zbyt kłopotliwe i zbyt rozwlekły w swoim wyjściu. Oto jak ja wreszcie setup byłem zadowolony, to znaczy, należy utworzyć plik zip dystrybucja ze słoików zależność w podkatalogu /lib i dodać wszystkie zależności do Class-Path wpisu w pliku manifestu:

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 jako GIST here.

Wynik można znaleźć w build/distributions i rozpakowane zawartość wyglądać następująco:

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

zawartość MyJarFile.jar#META-INF/MANIFEST.mf:

Oczywista Wersja: 1,0
Klasa główna: com.somepackage.MainClass
Ścieżka klasy: lib/commons-lang3-3.3.2.jar

+1

Dzięki wielkie dzieło ma ' –

Powiązane problemy