2013-02-03 99 views
26

我有一個運行的JAR本的build.gradle如何庫JAR文件的依賴在​​複製的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.+' 
    ) 
} 

,但它運行失敗,因爲依賴罐子找不到。

然後我添加以下代碼:

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

,但沒有改變......我無法找到該文件夾​​輸出/庫...

我怎樣才能複製依賴庫罐子指定的文件夾或路徑?

+0

你如何運行代碼? –

+0

@PeterNiederwieser Niederwieserfirst我運行:gradle構建,獲取可運行jar文件 然後,運行jar文件:java -jar XXX.jar – jychan

+0

您可能想使用Sync而不是Copy。另請參閱https://docs.gradle.org/current/userguide/working_with_files.html#sec:sync_task – morty

回答

1

應用程序插件需要您設置主類名是這樣的:

mainClassName = "com.test.HelloWorld" 

您需要的是添加到您的構建腳本。請記住,如果您嘗試使用java命令運行應用程序,則還需要使用-cp設置類路徑。

應用程序插件通過提供任務distZip簡化了此過程。如果您運行該任務,您將在build/distributions下爲您創建一個完整的分配。該分發包含啓動腳本和所有依賴項。生成的啓動腳本已經爲您設置了類路徑,因此您不必再處理它。

31

地址:

build.dependsOn(copyToLib) 

gradle build運行,搖籃建立任務和任何任務取決於它(通過dependsOn聲明)。如果不設置build.dependsOn(copyToLib),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.+' 
    ) 
} 

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

build.dependsOn(copyToLib) 
+0

在SonarQube分析中,在Javacode AST掃描期間,我收到ERROR/WARN - 未找到類xx.yy.zz。爲了解決這個問題,我必須設置「sonar.java.libraries」,它包含編譯,測試編譯,運行時所需的所有jar(依賴項)。我添加了「從configurations.runtime的configurations.testcompile中的configuration.compile」。我在「build/dependent-jars」文件夾中獲得了所有的罐子。設置sonar.java.libraries = build/dependent-jar/*。jar我沒有收到錯誤。謝謝,由於gradle在工作區之外維護它的緩存,但是使用這段代碼,我能夠在構建文件夾中獲得.jar。 –

10

我找到應用程序插件的方式太麻煩,並在其輸出太冗長。下面是我終於得到了一個安裝我很高興的,即創建子目錄/lib與依賴罐子分佈zip文件,所有的依賴關係添加到Class-Path條目清單文件:

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 
} 

託管作爲依據here

結果可以在build/distributions發現並解壓縮後的內容是這樣的:

的lib /公地lang3-3.3.2.jar
myJarFile.jar中

內容的MyJarFile.jar#META-INF/MANIFEST.mf

Manifest-Version:1.0
主要類:com.somepackage.MainClass
類路徑:lib/commons-lang3-3.3.2。罐子

+1

感謝偉大的工作馬' –

相關問題