Trong gradle - làm thế nào tôi có thể nhúng lọ bên trong jar đầu ra xây dựng của tôi trong thư mục lib (đặc biệt là lib/enttoolkit.jar và lib/mail.jar)?gradle - làm thế nào để tôi xây dựng một cái lọ với một thư mục lib với các lọ khác trong đó?
Trả lời
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.
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 ..... –
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 –
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? –
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)
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
}
}
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
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
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
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
đơ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
Đ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
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
Làm việc hoàn hảo – nikhil
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
}
task <taskname>(type: Jar) {
archiveName 'nameofjar.jar'
doFirst {
manifest {
attributes 'Class-Path': configurations.compile.files.collect{ project.uri(it) }.join(' ')
}
}
}
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
https://stackoverflow.com/questions/4871656/using-gradle-to- build-a-jar-with-dependencies –