Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gradle多模块项目中未复制Jar文件_Java_Jar_Gradle - Fatal编程技术网

Java gradle多模块项目中未复制Jar文件

Java 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 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 "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)
任务区