2010-08-10 15 views

Trả lời

34

Lifted đúng nguyên văn từ: http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-Creatingafatjar

Gradle 0.9:

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

Gradle 0.8:

jar.doFirst { 
    for(file in configurations.compile) { 
     jar.merge(file) 
    } 
} 

Các đoạn trên sẽ chỉ bao gồm các phụ thuộc biên dịch cho dự án đó, không phải bất kỳ thời gian chạy bắc cầu phụ thuộc. Nếu bạn cũng muốn hợp nhất chúng, hãy thay thế configure.compile bằng configur.runtime.

EDIT: chỉ chọn lọ bạn cần

Thực hiện một cấu hình mới, releaseJars lẽ

configurations { 
    releaseJars 
} 

Thêm lọ bạn muốn cấu hình mà

dependencies { 
    releaseJars group: 'javax.mail', name: 'mail', version: '1.4' 
    //etc 
} 

sau đó sử dụng cấu hình trong tác vụ jar được nêu ở trên.

+1

Tôi đang ở trên 0,9rc1. vì vậy hãy thử đề xuất đầu tiên của bạn. Kéo theo mọi thứ tôi không muốn ..... –

+0

gần hơn Tôi nghĩ ... vấn đề là tôi cần những cái lọ trong một thư mục lib. Điều này kéo trong các lớp học từ các lọ. Tôi muốn lib/mail và lib/enttoolkit trong jar đầu ra –

+0

làm việc này ... loại: sourceSets { chính { java { srcDir "$ wepTrunk/OSGi/mycompany.osgi.server/src" } nguồn { srcDir "/Users/phil/dev/trunk/osgi/mycompany.osgi.server/lib" }} } nó đặt các lọ từ của tôi/người dùng/phil/dev/trunk/OSGi /mycompany.osgi.server/lib trong jar đầu ra của tôi, nhưng không nằm trong thư mục "lib". Bất kỳ ý tưởng làm thế nào để có được chúng trong một thư mục lib? –

6

Tôi cần điều tương tự bạn đã hỏi và sử dụng phương pháp này. bạn có thể không cần khai báo cấu hình tùy chỉnh, nhưng tôi cần phải tách các tệp jar được sử dụng cục bộ khỏi các tệp được khai báo trong tệp siêu xây dựng.

configurations{ 
    //declare custom config if necessary, otherwise just use compile 
    myLibs 
} 
dependencies { 
    //add lib/*.jar files to myLibs 
    myLibs fileTree(dir: 'lib', include: '*.jar') 
    compile { 
     //set compile configuration to extend from myLibs 
     extendsFrom myLibs 
    } 
} 
// task to copy libs to output/lib dir 
task copyToLib(type: Copy) { 
    into "$buildDir/output/lib" 
    from configurations.myLibs 
} 

jar { 
    //include contents of output dir 
    from "$buildDir/output" 
    manifest { 
     //... 
    } 
} 

//set build task to depend on copyToLib 
build.dependsOn(copyToLib) 
28

Nếu bạn có tất cả các lọ bên trong một thư mục (cho phép gọi nó là libs) trong dự án của bạn, bạn chỉ cần điều này:

jar { 
    into('lib') { 
     from 'libs' 
    } 
} 

Tôi đoán nó có nhiều khả năng rằng những lọ là phụ thuộc của một số loại. Sau đó, bạn có thể làm điều đó như thế này:

configurations { 
    // configuration that holds jars to copy into lib 
    extraLibs 
} 
dependencies { 
    extraLibs 'org.something:something-dep1:version' 
    extraLibs 'org.something:something-dep2:version' 
} 

jar { 
    into('lib') { 
     from configurations.extraLibs 
    } 
} 
+1

Nếu bạn muốn tất cả các phụ thuộc, bạn cũng có thể sao chép từ 'configure.runtime', cung cấp cho bạn các phụ thuộc mặc định' biên dịch', tiết kiệm cho bạn sự cố khi tạo cấu hình 'extraLibs' của riêng bạn. – Thunderforge

+0

Lỗi: Không thể tìm phương thức jar() cho đối số [build_bndovev91pu8trwrdngc8qh7i $ _run_closure5 @ 3be2321e] về dự án ': app' của loại org.gradle.api.Project. – naXa

7

Tôi cũng cần phải làm một cái gì đó tương tự và không hoàn toàn có thể có được những gì Guus và stigkj đề nghị làm việc, nhưng đã đủ gần với sự giúp đỡ của họ để làm việc này (Guus 'dụ thổi lên trên dependencies { compile { extendsFrom myLibs }} đóng cửa cho tôi.

apply plugin: 'groovy' 

repositories { 
    mavenCentral() 
} 

configurations { 
    // custom config of files we want to include in our fat jar that we send to hadoop 
    includeInJar 
} 

dependencies { 
    includeInJar 'org.codehaus.groovy:groovy:1.8.6' 

    configurations.compile.extendsFrom(configurations.includeInJar) 
} 

jar { 
    into('lib') { 
     println "includeInJar: " + configurations.includeInJar.collect { File file -> file } 
     from configurations.includeInJar 
    } 

} 

Sau đó chạy gradle jar và kiểm tra việc jar tạo mang lại cho tôi kết quả này, cho thấy rằng tôi nhận được file jar có groovy cũng như tất cả lọ mà nó phụ thuộc vào bên trong "lọ chất béo":

% gradle jar                               
includeInJar: [/Users/tnaleid/.gradle/caches/artifacts-8/filestore/org.codehaus.groovy/groovy/1.8.6/jar/553ca93e0407c94c89b058c482a404427ac7fc72/groovy-1.8.6.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/antlr/antlr/2.7.7/jar/83cd2cd674a217ade95a4bb83a8a14f351f48bd0/antlr-2.7.7.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm/3.2/jar/9bc1511dec6adf302991ced13303e4140fdf9ab7/asm-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-tree/3.2/jar/cd792e29c79d170c5d0bdd05adf5807cf6875c90/asm-tree-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-commons/3.2/jar/e7a19b8c60589499e35f5d2068d09013030b8891/asm-commons-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-util/3.2/jar/37ebfdad34d5f1f45109981465f311bbfbe82dcf/asm-util-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-analysis/3.2/jar/c624956db93975b7197699dcd7de6145ca7cf2c8/asm-analysis-3.2.jar] 
:compileJava UP-TO-DATE 
:compileGroovy UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:jar 

BUILD SUCCESSFUL 

Total time: 3.387 secs 

% jar tvf build/libs/gradletest.jar                         
    0 Mon Mar 12 11:40:00 CDT 2012 META-INF/ 
    25 Mon Mar 12 11:40:00 CDT 2012 META-INF/MANIFEST.MF 
    0 Mon Mar 12 11:40:00 CDT 2012 lib/ 
5546084 Mon Mar 05 13:13:32 CST 2012 lib/groovy-1.8.6.jar 
445288 Mon Mar 05 13:13:38 CST 2012 lib/antlr-2.7.7.jar 
43398 Mon Mar 05 13:13:40 CST 2012 lib/asm-3.2.jar 
21878 Mon Mar 05 13:13:40 CST 2012 lib/asm-tree-3.2.jar 
33094 Mon Mar 05 13:13:40 CST 2012 lib/asm-commons-3.2.jar 
36551 Mon Mar 05 13:13:40 CST 2012 lib/asm-util-3.2.jar 
17985 Mon Mar 05 13:13:40 CST 2012 lib/asm-analysis-3.2.jar 
+0

Ok, tôi đã thực hiện những gì được mô tả ở đây nhưng tôi vẫn nhận được 'Ngoại lệ trong chủ đề" chính "java.lang.NoClassDefFoundError: com/rabbitmq/client/ConnectionFactory'. Tôi có nên thiết lập classpath bằng cách nào đó? – omikron

17

đơn giản:

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

jar { dependsOn copyToLib } 

chạy nó:

$ gradle jar 
... 
$ tree build/libs 

build/libs 
├── your-project-0.0.1.BUILD-SNAPSHOT.jar 
└── lib 
    ├── akka-actor-2.0.jar 
    ├── akka-camel-2.0.jar 
    ├── ... ... ... 
    ├── spring-expression-3.1.0.RELEASE.jar 
    └── zmq-2.1.9.jar 

1 directory, 46 files 
+6

Điều này sao chép các thư viện vào thư mục đầu ra, nhưng không phải vào tệp JAR - đó là câu hỏi. – TheOperator

6

Dưới mã có thể bị xét xử.Nó phụ thuộc vào nhiệm vụ jar và là Loại Jar

task createJobJar(dependsOn:jar,type:Jar) { 
    manifest { 
     attributes(
       "Implementation-Title": 'Job ' 
       ,"Implementation-Version": version 
     ) 
    } 
    classifier 'job' 
    destinationDir new File("$buildDir") 
    into('libs'){ 
     from configurations.compile 
    } 
    into('classes'){ 
     from "$buildDir/classes" 
    } 
    into('resources'){ 
     from "$projectDir/src/main/resources" 
    } 
    into('scripts'){ 
     from "$projectDir/src/main/scripts" 
    } 
} 

Mã trên sẽ đóng gói nội dung khác nhau trong các thư mục khác nhau. Được thử nghiệm trên gradle 2.2

+0

Làm việc hoàn hảo – nikhil

0

Trong trường hợp của tôi, tôi cần đưa nội dung của dự án gốc Jar vào tiểu dự án Jar. Vì vậy, để làm cho nó hoạt động, người ta có thể sử dụng mẫu này:

jar{ 
    manifest{ 
    attributes 'Main-Class':'<main class>' 
    } 
    def conf= configurations.find {it.name.equals('compile') } 
    File jar= conf.files.find {it.name.contains('<name or part of the name of produced Jar>')} 

    FileTree fileTree=zipTree(jar) 
    from fileTree 
} 

dụ của tôi:

jar{ 
    manifest{ 
     attributes 'Main-Class':'alexiy.jace.Jace' 
    } 
    description='Make a runnable API Jar' 
    def conf= configurations.find {it.name.equals('compile') } 
    File tools= conf.files.find {it.name.contains('Tools')} 

    FileTree fileTree=zipTree(tools) 
    from fileTree 
} 
-1
task <taskname>(type: Jar) { 
    archiveName 'nameofjar.jar' 
    doFirst { 
    manifest { 
      attributes 'Class-Path': configurations.compile.files.collect{ project.uri(it) }.join(' ') 
     } 
    } 
} 
+1

Một chút giải thích về những gì mã này có thể giúp giải thích một số bit cụ thể? – Tom