Gradle-如何构建一个带有 lib dir 和其他罐子的罐子?

在 gradle 中——我如何在库中将 jar 嵌入到我的构建输出 jar 中 目录(特别是 lib/enttoolkit.jar 和 lib/mail.jar) ?

102047 次浏览

原文: http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-Creatingafatjar

九年级:

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

第0.8级:

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

上面的代码片段将只包括该项目的编译依赖项,而不包括任何传递运行时依赖项。如果您还想合并它们,那么可以用 configations.running 替换 configations.coding。

只选择你需要的罐子

创建一个新的配置,可能会释放 Jars

configurations {
releaseJars
}

将您想要的 jar 添加到该配置中

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

然后在上面概述的 jar 任务中使用该配置。

我需要同样的东西你问,并使用这种方法。您可能不需要自定义配置声明,但是我需要将本地使用的 jar 文件与超级构建文件中声明的文件分开。

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)

如果您的项目中有一个目录(我们称之为 libs)中的所有 jar,那么您只需要:

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

我猜这些罐子更有可能是某种依赖。然后你可以这样做:

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
}
}

我也需要做一些类似的事情,并且不能完全得到 Guus 和 tigkj 建议的工作,但是在他们的帮助下得到了足够的接近使得这个工作(Guus 的例子对我来说在 dependencies { compile { extendsFrom myLibs }}闭包上爆炸了。

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
}


}

然后运行 gradle jar并检查创建的 jar 给我这个输出,显示我得到的 jar 文件包含 groovy 以及它所依赖的“ fat jar”中的所有 jar:

%  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

简单:

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


jar { dependsOn copyToLib }

运行它:

$ 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

下面的代码可以尝试。它取决于 Jar 任务,是 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"
}
}

上面的代码将在不同的目录中包含不同的内容。 2.2级测试

在我的例子中,我需要将根项目 Jar 的内容包含到子项目 Jar 中。因此,为了让它工作,可以使用这个模板:

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
}

我的例子:

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(' ')
}
}
}

我也遇到过同样的问题,我是这样解决的:

将这些文件复制到 lib 文件夹中,使用 copitToLib 并使用 Class-Path 引用依赖项

ext.mainClass = 'test.main'


dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.google.code.gson:gson:2.8.2'
//....
}


jar {
from "$buildDir/libs/lib"
manifest {
attributes 'Main-Class': 'test.main',
'Class-Path': configurations.compile.collect { 'lib/'+it.getName() }.join(' ')
}
}


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


build.dependsOn(copyToLib)

下面是我如何设法实现这个构建设置使用 Gradle。这将把您的应用程序构建到一个 Jar 中,将生成的库 Jar 复制到 build/libs 下的 libs 目录中,并配置类路径将这些 Jar 包含在创建的 build/libs/libs 目录中。

 plugins {
id 'application'
}


group 'org.pkg'
version '1.0-SNAPSHOT'


ext.mainClass = 'org.pkg.MainClass'


repositories {
mavenCentral()
mavenLocal()
}


dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile group: 'junit', name: 'junit', version: '4.12'


implementation group: 'com.mchange', name: 'c3p0', version: '0.9.5.5'
}
 

task copyToLib(type: Copy) {
into "$buildDir/libs/libs"
// configurations.runtimeClasspath includes maven jars
from configurations.runtimeClasspath
}


def archiveVersion = "1.0.0"


task uberJar(type: Jar) {
archiveClassifier = 'uber'


from sourceSets.main.output
// include the copy task
dependsOn(copyToLib)


// use onfigurations.runtimeClasspath to collect all the jars
manifest {
attributes(
'Class-Path': configurations.runtimeClasspath.collect { 'libs/' + it.getName() }.join(' '),
'Main-Class': 'org.pkg.MainClass',
"Implementation-Title": "Gradle",
"Implementation-Version": archiveVersion
)
}
}