在 jar 中导出 Gradle 个子项目而不将其添加到依赖项
Export Gradle subproject in jar without adding it to dependencies
我有一个包含 3 个子项目的 Gradle 项目:core
、1_13
和 1_14
。 1_13
和 1_14
取决于 core
项目,但最终构建必须在 core
项目上完成,我想包括 1_13
和 1_14
在罐子里。
1_13
和 1_14
子项目的 dep 不在 core
子项目中。
实际上,我使用sourceSets
来包含1_13
和1_14
项目的源文件,但事实是子项目中存在不存在的依赖项在 core
子项目中,并且我不能在 core
子项目的依赖项中使用 apiElements
,因为如果我进行循环导入,我就会卡住。
其实我用的是这个:
sourceSets {
main {
java {
srcDirs 'src', '../1_13/src', '../1_14/src'
resources {
srcDir 'resources'
}
}
}
}
但是因为核心子项目中不存在库,所以构建失败。
我明确指出我只在编译时需要库,而不是在运行时。我也无法将库添加到 core
子项目,因为子模块使用同一库的不同版本。核心模块只是在这里路由是否应该使用一个或另一个包。
最简洁的方法是将 1_13
和 1_14
使用的通用逻辑提取到新项目(例如 common
)并添加 1_13
和1_14
作为对核心项目的真正依赖。
你当然可以破解“使用子项目的依赖项作为核心项目的依赖项”之类的东西,但这样的破解通常会在以后造成更多麻烦。
继续搜索一段时间后,我找到了使用 Gradle 任务来完成我想要的事情的方法。
实际上,我创建了一个任务来合并不同模块的所有 jar 文件:
task buildPlugin(type: Jar, group: 'build') {
// Change the archive name and include all outputs of build of modules
archiveFileName = "${rootProject.name}.jar"
from getRootProject().allprojects.findAll().sourceSets.main.output
// Delete the old jar of the core module, to keep only the finally build jar file
doLast {
var oldJar = new File(project.buildDir, "libs/" + project.name + "-" + project.version + ".jar")
if (oldJar.exists()) {
oldJar.delete()
}
}
}
我有一个包含 3 个子项目的 Gradle 项目:core
、1_13
和 1_14
。 1_13
和 1_14
取决于 core
项目,但最终构建必须在 core
项目上完成,我想包括 1_13
和 1_14
在罐子里。
1_13
和 1_14
子项目的 dep 不在 core
子项目中。
实际上,我使用sourceSets
来包含1_13
和1_14
项目的源文件,但事实是子项目中存在不存在的依赖项在 core
子项目中,并且我不能在 core
子项目的依赖项中使用 apiElements
,因为如果我进行循环导入,我就会卡住。
其实我用的是这个:
sourceSets {
main {
java {
srcDirs 'src', '../1_13/src', '../1_14/src'
resources {
srcDir 'resources'
}
}
}
}
但是因为核心子项目中不存在库,所以构建失败。
我明确指出我只在编译时需要库,而不是在运行时。我也无法将库添加到 core
子项目,因为子模块使用同一库的不同版本。核心模块只是在这里路由是否应该使用一个或另一个包。
最简洁的方法是将 1_13
和 1_14
使用的通用逻辑提取到新项目(例如 common
)并添加 1_13
和1_14
作为对核心项目的真正依赖。
你当然可以破解“使用子项目的依赖项作为核心项目的依赖项”之类的东西,但这样的破解通常会在以后造成更多麻烦。
继续搜索一段时间后,我找到了使用 Gradle 任务来完成我想要的事情的方法。
实际上,我创建了一个任务来合并不同模块的所有 jar 文件:
task buildPlugin(type: Jar, group: 'build') {
// Change the archive name and include all outputs of build of modules
archiveFileName = "${rootProject.name}.jar"
from getRootProject().allprojects.findAll().sourceSets.main.output
// Delete the old jar of the core module, to keep only the finally build jar file
doLast {
var oldJar = new File(project.buildDir, "libs/" + project.name + "-" + project.version + ".jar")
if (oldJar.exists()) {
oldJar.delete()
}
}
}