2013-02-03 30 views
26

tôi đã nhận một jar Runnable với build.gradle nàylàm thế nào để sao chép các phụ thuộc thư viện lọ trong 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.+' 
    ) 
} 

nhưng nó chạy thất bại, bởi vì sự phụ thuộc lọ không thể tìm thấy.

và sau đó tôi thêm mã này:

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

nhưng thay đổi không có gì ... tôi không thể tìm đầu ra thư mục/libs ...

làm thế nào tôi có thể sao chép các phụ thuộc libs lọ để một thư mục hoặc đường dẫn được chỉ định?

+0

Làm cách nào để bạn chạy mã? –

+0

@PeterNiederwieser Niederwieserfirst tôi chạy: gradle build, lấy file jar runnable sau đó, chạy file jar: java -jar XXX.jar – jychan

+0

Bạn có thể muốn sử dụng Sync thay vì Copy. Xem thêm https://docs.gradle.org/current/userguide/working_with_files.html#sec:sync_task – morty

Trả lời

1

Plugin ứng dụng đòi hỏi bạn phải thiết lập tên lớp học chính như thế này:

mainClassName = "com.test.HelloWorld" 

Bạn sẽ cần phải thêm rằng để xây dựng kịch bản của bạn. Hãy nhớ rằng nếu bạn cố chạy ứng dụng của mình bằng lệnh java, bạn cũng sẽ cần đặt đường dẫn lớp với -cp.

Plugin ứng dụng đơn giản hóa quy trình này bằng cách cung cấp tác vụ distZip. Nếu bạn chạy tác vụ đó, bản phân phối đầy đủ sẽ được tạo cho bạn dưới build/distributions. Bản phân phối chứa các tập lệnh bắt đầu và tất cả các phụ thuộc. Các tập lệnh bắt đầu đã tạo đã đặt đường dẫn lớp cho bạn để bạn không phải xử lý nó nữa.

31

Add:

build.dependsOn(copyToLib) 

Khi gradle build chạy, Gradle xây dựng nhiệm vụ và bất cứ nhiệm vụ phụ thuộc vào nó (công bố bởi dependsOn). Nếu không có thiết lập build.dependsOn(copyToLib), Gradle sẽ không liên kết tác vụ sao chép với tác vụ xây dựng.

Vì vậy:

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

Trong phân tích SonarQube, trong quá trình quét Javacode AST, tôi đã nhận được L ERI/CẢNH BÁO - Không tìm thấy xx.yy.zz lớp. Để khắc phục điều đó, tôi phải đặt "sonar.java.libraries" chứa tất cả các jar (phụ thuộc) cần thiết trong khi biên dịch, testCompile, thời gian chạy. Tôi đã thêm "từ configure.compile từ configure.testCompile từ configur.runtime". Tôi có tất cả các lọ trong thư mục "build/dependent-jars". Thiết lập sonar.java.libraries = build/depend-jars/* jar Tôi không nhận được lỗi. Cảm ơn, như gradle duy trì bộ nhớ cache của nó bên ngoài không gian làm việc nhưng sử dụng mã này tôi đã có thể nhận được .jar trong thư mục xây dựng. –

10

Tôi tìm ứng dụng Plugin cách quá cồng kềnh và quá rườm rà trong sản lượng của nó. Đây là cách cuối cùng tôi đã có một thiết lập tôi đang hài lòng với, ví dụ, tạo một tập tin phân phối zip với lọ phụ thuộc trong thư mục con /lib và thêm tất cả phụ thuộc vào Class-Path entry trong file manifest:

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 như một ý chính here.

Kết quả có thể được tìm thấy trong build/distributions và các nội dung đã được giải nén giống như thế này:

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

Nội dung MyJarFile.jar#META-INF/MANIFEST.mf:

Manifest-Version: 1.0
Main-Class: com.somepackage.MainClass
Đường dẫn lớp: lib/commons-lang3-3.3.2.jar

+1

Cảm ơn công việc tuyệt vời ma ' –

Các vấn đề liên quan