为具有瞬态 scala 依赖性的 spring-xd 项目优化 gradle

Optimize gradle for spring-xd project with transient scala dependency

我正在开发一个项目,其中包含 spring XD 的一系列模块子项目,这些子项目恰好对恰好使用 Scala 的非模块子项目具有暂时依赖性:

ext {
  springXdVersion = '1.1.0.RELEASE'
  moduleProjects  = subprojects.findAll { project -> project.path.startsWith(':modules.')}
  javaProjects    = subprojects - (moduleProjects + nonJavaProjects)
}

configure(moduleProjects) { moduleProject ->
  apply plugin: 'spring-xd-module'
}

project('core-dependency') {
  apply plugin: 'scala'
  // configuration/dependencies
}

project('modules.source.example') {
  dependencies {
    provided(":core-dependency")
  }
}

// More modules bearing resemblance to modules.source.example

核心依赖最终设置在我们的 xd 容器的类路径中,并在 运行 时间以这种方式提供给模块。

不幸的是,似乎对于每个使用它的模块,都会重新编译核心依赖项(这特别昂贵,因为它也包含 scala 编译)。这会导致构建到 运行 30 分钟以北,我想对此进行改进。有没有办法缩短构建时间?理想情况下,我不想重新编译核心依赖性,但我不确定如何实现这一点,考虑到 bootRepackage 似乎负责为每个模块触发它。我还尝试了其他技巧,例如并行性,但到目前为止,这样做只能设法冻结我的系统。我正在使用 gradle 2.1.

我应该注意到 gradle 配置文件报告表明对于每个模块,大部分时间都在配置模块步骤中沉没,根据 spring-xd repo,看起来像这个:

project.task('configureModule') << {
            project.configurations.provided.resolvedConfiguration.firstLevelModuleDependencies.each {
                excludeTransitiveDependencies(project, it)
            }
        }

scala 依赖来自 Spark streaming SpringXD 中的集成。我们正在努力消除对 spring-xd-dirt 的 spark 依赖,并从模块中提供它:

https://jira.spring.io/browse/XD-2857

您依赖于哪个特定的非模块子项目?如果是 spring-xd-module,那么您可以尝试 1.2.0.M1,我们已将 spark 依赖项从 spring-xd-module 移动到 spring-xd-dirt

在 configureModule 步骤中,所有项目都会评估可传递的提供的依赖项,即核心依赖项。速度变慢的原因是核心依赖项依赖的依赖项数量过多,因此需要扫描。由于我们希望避免由 configureModule 扫描核心依赖性,因为它太费时了,而且我们知道它需要从模块 fatjars 中排除,适当的做法是从提供的配置中删除核心依赖性,并且简单地我们自己将其从脂肪罐中排除。

为此,gradle 构建脚本修改如下:

ext {
  springXdVersion = '1.1.0.RELEASE'
  moduleProjects  = subprojects.findAll { project -> project.path.startsWith(':modules.')}
  javaProjects    = subprojects - (moduleProjects + nonJavaProjects)
}

configure(moduleProjects) { moduleProject ->
  apply plugin: 'spring-xd-module'

  configurations{
    core
    compile.extendsFrom(core)
  }

configurations.exported.exclude module: 'core-dependency'
}

project('core-dependency') {
  apply plugin: 'scala'
  // configuration/dependencies
}

project('modules.source.example') {
  dependencies {
    core project(":core-dependency")
  }
}

// More modules bearing resemblance to modules.source.example

"core" 配置本质上是第二个 "provided" 配置,它不会被 configureModule 任务拾取,避免了在它上面浪费时间的评估。它也被排除在 "exported" 配置之外,其内容决定了 bootRepackage 构建的 fat jar 中的内容。