Java gradle多模块项目中未复制Jar文件
我正在使用Gradle 2.1Java gradle多模块项目中未复制Jar文件,java,jar,gradle,Java,Jar,Gradle,我正在使用Gradle 2.1 当我在根目录下运行gradle jar时,我可以在hoge/distribution中获得hoge.jar,但在distribution/libs中没有common.jar。 如果我再次运行gradle jar,common.jar是在distribution/libs下构建的 为什么common.jar第一次没有出现在发行版/libs中 格雷德尔先生 rootProject.name = "sample" include "common" include "ho
当我在根目录下运行
gradle jar
时,我可以在hoge/distribution中获得hoge.jar,但在distribution/libs中没有common.jar。如果我再次运行
gradle jar
,common.jar
是在distribution/libs下构建的
为什么common.jar第一次没有出现在发行版/libs中
格雷德尔先生
rootProject.name = "sample"
include "common"
include "hoge"
root->build.gradle
allprojects {
apply plugin: 'java'
apply plugin: 'idea'
repositories {
mavenCentral()
}
}
dependencies {
compile('log4j:log4j:1.2.17')
}
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'
}
公共->build.gradle
allprojects {
apply plugin: 'java'
apply plugin: 'idea'
repositories {
mavenCentral()
}
}
dependencies {
compile('log4j:log4j:1.2.17')
}
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'
}
hoge->build.gradle
allprojects {
apply plugin: 'java'
apply plugin: 'idea'
repositories {
mavenCentral()
}
}
dependencies {
compile('log4j:log4j:1.2.17')
}
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'
}
首先,您在
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
文件呢?您应该知道,任务的某些部分在配置阶段执行,而某些部分在运行时执行(有关更多说明,请参阅例如)。代码的以下部分:
copy {
from configurations.compile
into "distribution/lib"
}
在配置时运行,如中所述:当参数解析为不存在的文件时,将忽略该参数。这就是发生的事情common.jar
还不存在,因此它被忽略,因此不被复制。当第二次运行jar
时,common.jar
已经存在,因此它不会解析为null并被复制
要解决此问题,请创建dist
任务:
task dist << {
project.copy {
from configurations.compile
into file('distribution/lib')
}
}
jar.finalizedBy(dist)
任务区