从所有多项目gradle构建依赖项生成CLASSPATH

时间:2015-03-11 12:45:39

标签: gradle

我们正在使用外部测试工具(Squish),该工具在我们的主要gradle构建之后运行。这需要可见的测试类。目前,CLASSPATH环境变量是由各种bash脚本和其他字符串操作构建的。我的目标是让学生自动完成这项工作。

由于构建是在一个非常慢的源代码控制系统(clearcase)上完成的,因此测试最好是针对构建所留下的类文件/ JAR而不是额外的副本/压缩到单个JAR等。

类路径需要包含

  • 生成的JAR文件,通常位于build / libs / project-x.jar
  • 测试类通常构建/ classes / test
  • 测试资源通常构建/资源/测试
  • 任何第三方罐子的任何子项目依赖于,log4j,spring等。

这是一个复杂的多项目构建,但我已经简化为跟随父母和两个孩子的示例。

父settings.gradle

include ':child1'
include ':child2'

父build.gradle

allprojects {
  apply plugin: 'java'
  repositories {
    mavenCentral()
  }
}

Child 1 build.gradle

dependencies {
   compile 'org.springframework:spring-context:4.1.2.RELEASE'
   compile 'org.springframework:spring-beans:4.1.2.RELEASE'
}

Child 2 build.gradle

dependencies {
   project (":child1")
}

到目前为止我得到了什么。这是正确的方法吗?是否可以更好地简化或完全重写?

task createSquishClasspath << {
  def paths = new LinkedHashSet()
  paths.addAll(subprojects.configurations.compile.resolvedConfiguration.resolvedArtifacts.file.flatten())
  paths.addAll(subprojects.jar.outputs.files.asPath)
  paths.addAll(subprojects.sourceSets.test.output.resourcesDir)
  paths.addAll(subprojects.sourceSets.test.output.classesDir)

  paths.each {
    println "${it}"
  }

  println paths.join(File.pathSeparator)

}

输出

C:\so-question\Parent\local-repo\spring\spring-context-4.1.2.RELEASE.jar
C:\so-question\Parent\local-repo\spring\spring-beans-4.1.2.RELEASE.jar
C:\so-question\Parent\child1\build\libs\child1.jar
C:\so-question\Parent\child2\build\libs\child2.jar
C:\so-question\Parent\child1\build\resources\test
C:\so-question\Parent\child2\build\resources\test
C:\so-question\Parent\child1\build\classes\test
C:\so-question\Parent\child2\build\classes\test

1 个答案:

答案 0 :(得分:0)

总之,到目前为止,最好的答案是加入项目依赖项的所有路径以及所有test.output.resourcesDirtest.output.classesDir

task createSquishClasspath << {
  def paths = new LinkedHashSet()
  paths.addAll(subprojects.configurations.compile.resolvedConfiguration.resolvedArtifacts.file.flatten())
  paths.addAll(subprojects.jar.outputs.files.asPath)
  paths.addAll(subprojects.sourceSets.test.output.resourcesDir)
  paths.addAll(subprojects.sourceSets.test.output.classesDir)

  paths.each {
    println "${it}"
  }

  println paths.join(File.pathSeparator)

}