为具有瞬态 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 中的内容。
我正在开发一个项目,其中包含 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 中的内容。