Jar文件未在gradle multi模块项目中复制

时间:2014-10-24 12:53:52

标签: java jar gradle

我正在使用Gradle 2.1
当我在root目录运行gradle jar时,我可以在 hoge / distribution 中获取 hoge.jar ,但是没有 common.jar distribution / libs 中 如果我再次运行gradle jarcommon.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'
}

1 个答案:

答案 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 目录。希望现在很清楚。