Gradle可以将多个项目放到一个jar中吗?
我知道你可以使用这样的方法为一个项目做到这一点:
task packageTests(type: Jar) {
from sourceSets.test.classes
}
但是一个人如何将多个子项目压缩成一个罐子?
我尝试过这个并不起作用:
task packageTests(type: Jar) {
from project(':core').sourceSets.main.classes
from project(':core:google').sourceSets.test.classes
from project(':core:bing').sourceSets.test.classes
}
答案 0 :(得分:7)
这应该适用于您想要做的事情。这应该在根gradle构建文件中。
subprojects.each { subproject -> evaluationDependsOn(subproject.path)}
task allJar(type: Jar, dependsOn: subprojects.assemble) {
baseName = 'your-base-name'
subprojects.each { subproject ->
from subproject.configurations.archives.allArtifacts.files.collect {
zipTree(it)
}
}
}
您可以通过将其添加为存档来发布:
artifacts {
archives allJar
}
答案 1 :(得分:7)
这是我的解决方案,这有点简单:
// Create a list of subprojects that you wish to include in the jar.
def mainProjects = [':apps',':core',':gui',':io']
task oneJar( type: Jar , dependsOn: mainProjects.collect{ it+":compileJava"}) {
baseName = 'name of jar'
from files(mainProjects.collect{ project(it).sourceSets.main.output })
}
代码已在Gradle 1.12上测试
答案 2 :(得分:4)
以下解决方案与CaTalyst.X提议的解决方案非常相似,但直接使用 jar 任务。
subprojects.each { subproject -> evaluationDependsOn( subproject.path ) }
jar.dependsOn subprojects.tasks['classes']
jar {
baseName = 'MyApp'
manifest {
attributes 'Main-Class': 'org.abc.App'
}
subprojects.each { subproject ->
from subproject.sourceSets.main.output.classesDir
from subproject.sourceSets.main.output.resourcesDir
}
}
对Gradle 2.1和2.2.1进行了测试
答案 3 :(得分:1)
我知道已经回答了这个问题,但是由于答案是旧的(当前Gradle版本是较新的主要版本-6.2.2)并且该线程在搜索引擎中显示的很高,因此我将发布对我有用的解决方案
通常,我的问题与原始帖子中所述的问题类似/相同:我想从所有子项目中获取类并将它们压缩到一个jar中(最好使用最默认的设置)。最后,我发现以下代码可以解决问题:
jar {
from subprojects.sourceSets.main.output
}
但是,尽管它可以正确构建jar,但我还希望能够将该jar作为单个工件发布到Maven存储库,这取决于所有子项目所做的一切。为此,主项目必须依赖于子项目的依赖关系,这可以通过以下方式完成:
subprojects.each { evaluationDependsOn(it.path) }
dependencies {
api(externalSubprojectsDependencies('api'))
implementation(externalSubprojectsDependencies('implementation'))
}
private externalSubprojectsDependencies(String configuration) {
subprojects.collect { it.configurations[configuration].allDependencies }.flatten()
.findAll { !it.properties['dependencyProject'] } // this looks like hack, I'd love to see better solution
}
仅复制了外部依赖项-我们不希望pom.xml
中列出内部(项目)依赖项,因为它们的所有类仍然在jar中。