我正在使用Gradle 2.1
当我在root目录运行gradle jar
时,我可以在 hoge / distribution 中获取 hoge.jar ,但是没有 common.jar 在 distribution / libs 中
如果我再次运行gradle jar
,common.jar
将在 distribution / libs 下构建。
为什么 common.jar 第一次出现在 distribution / libs 中?
setting.gradle
rootProject.name = "sample"
include "common"
include "hoge"
根 - >的build.gradle
allprojects {
apply plugin: 'java'
apply plugin: 'idea'
repositories {
mavenCentral()
}
}
常见 - >的build.gradle
dependencies {
compile('log4j:log4j:1.2.17')
}
hoge - >的build.gradle
dependencies {
compile project(':common')
compile('org.dbunit:dbunit:2.2')
}
jar {
copy {
from configurations.compile
into "distribution/lib"
}
def manifestClasspath = configurations.compile.collect{ 'lib/' + it.getName() }.join(' ')
manifest {
attributes "Main-Class" : "com.hoge.TestMain"
attributes 'Class-Path': manifestClasspath
}
from (configurations.compile.resolve().collect { it.isDirectory() ? it : fileTree(it) }) {
exclude 'META-INF/MANIFEST.MF'
exclude 'META-INF/*.SF'
exclude 'META-INF/*.DSA'
exclude 'META-INF/*.RSA'
}
destinationDir = file("distribution")
archiveName = 'hoge.jar'
}
答案 0 :(得分:2)
首先,你在jar
配置关闭中混合了逻辑。此闭包应该只负责配置正在创建的jar文件,不也用于准备分发目录。所以这就是任务的样子:
jar {
def manifestClasspath = configurations.compile.collect{ 'lib/' + it.getName() }.join(' ')
manifest {
attributes "Main-Class" : "com.hoge.TestMain"
attributes 'Class-Path': manifestClasspath
}
from (configurations.compile.resolve().collect { it.isDirectory() ? it : fileTree(it) }) {
exclude 'META-INF/MANIFEST.MF'
exclude 'META-INF/*.SF'
exclude 'META-INF/*.DSA'
exclude 'META-INF/*.RSA'
}
destinationDir = file("distribution")
archiveName = 'hoge.jar'
}
那么,为什么第一次运行jar任务时不会复制common.jar
文件?您应该知道任务的某些部分正在配置阶段执行,而某些部分正在运行(有关更多说明,请参阅here,例如)。以下部分代码:
copy {
from configurations.compile
into "distribution/lib"
}
在配置上运行,如docs中所述:当参数解析为不存在的文件时,该参数将被忽略。,这是怎么回事common.jar
尚不存在,因此被忽略,因此不会被复制。当jar
第二次运行时common.jar
已经存在,因此它不会被解析为null并被复制。
要解决此问题,请创建dist
任务:
task dist << {
project.copy {
from configurations.compile
into file('distribution/lib')
}
}
jar.finalizedBy(dist)
最终确定jar
任务并将所有必需的工件复制到 distribution 目录。希望现在很清楚。