Gradle:将多个项目打包到一个jar中
我有一个gradle多项目,希望创建一个包含所有子项目类和外部依赖项的jar(库) 我有以下项目结构。每个项目都有自己的第三方依赖项。通用依赖项包含在根项目中。两个模块A和B依赖于核心Gradle:将多个项目打包到一个jar中,gradle,fatjar,Gradle,Fatjar,我有一个gradle多项目,希望创建一个包含所有子项目类和外部依赖项的jar(库) 我有以下项目结构。每个项目都有自己的第三方依赖项。通用依赖项包含在根项目中。两个模块A和B依赖于核心 + root-project (only build.gradle and settings.gradle) - core (src/main/java, src/main/resources, ..) - module-A (src/main/java, src/main/resourc
+ root-project (only build.gradle and settings.gradle)
- core (src/main/java, src/main/resources, ..)
- module-A (src/main/java, src/main/resources, ..)
- module-B (src/main/java, src/main/resources, ..)
为了导出单个jar,我将以下任务添加到根项目的build.gradle中:
apply plugin: "java"
subprojects.each { subproject -> evaluationDependsOn(subproject.path)}
task allJar(type: Jar, dependsOn: subprojects.jar) {
baseName = 'multiproject-test'
subprojects.each { subproject ->
from subproject.configurations.archives.allArtifacts.files.collect {
zipTree(it)
}
}
}
artifacts {
archives allJar
}
这种方法可行,但只收集项目源文件。忽略第三方依赖项。所以我尝试了shadowplugin(),它也应该包含外部依赖项
不幸的是,这个插件根本收集不到任何东西。这很可能是因为根项目及其子项目之间缺少依赖关系。我如何告诉影子插件它应该收集子项目的源代码?还是有更好的方法从多个项目中导出单个库
使用shadow插件完成build.gradle:
/****************************************
* instructions for all projects
****************************************/
allprojects {
apply plugin: 'idea'
apply plugin: 'eclipse'
group = 'com.test.multi-project'
version = '1.0'
}
/****************************************
* instructions for each sub project
****************************************/
subprojects {
apply plugin: "java"
sourceCompatibility = 1.9
targetCompatibility = 1.9
repositories {
mavenCentral()
}
dependencies {
compile "org.slf4j:slf4j-api:1+"
compile "ch.qos.logback:logback-core:1+"
compile "ch.qos.logback:logback-classic:1+"
testCompile "junit:junit:4+"
}
}
/****************************************
* Single jar out of all sub projects
****************************************/
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
}
}
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'java'
shadowJar {
baseName = 'multiproject-test'
}
子模块包含在根项目的settings.gradle中
rootProject.name = 'myproject-root'
// submodules
include ":core"
include ":module-A"
include ":module-B"
谢谢你的帮助 像这样简单的事情怎么样:
task fatJar(type: Jar) {
subprojects.each { subproject ->
from subproject.configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
我使用此处介绍的解决方案解决问题: 我的build.gradle现在看起来像这样:
/****************************************
* instructions for all projects
****************************************/
allprojects {
apply plugin: 'idea'
apply plugin: 'java'
repositories {
mavenCentral()
}
group = 'com.test.multiproject'
version = '1.0'
sourceCompatibility = 1.9
targetCompatibility = 1.9
}
/****************************************
* instructions for each sub project
****************************************/
subprojects {
// common dependencies
dependencies {
compile "org.slf4j:slf4j-api:1+"
compile "ch.qos.logback:logback-core:1+"
compile "ch.qos.logback:logback-classic:1+"
testCompile "junit:junit:4+"
}
}
/****************************************
* Single library jar containing all sub projects and 3rd party dependencies
****************************************/
configurations {
childJars
}
dependencies {
subprojects.each {
childJars project(it.path)
}
}
jar {
dependsOn configurations.childJars
from { configurations.childJars.collect { zipTree(it) } }
}
在构建jar本身的同时获取所有运行库怎么样
jar {
archiveName 'Some.jar'
manifest {
attributes 'Implementation-Title': 'Some',
'Plugin-Class': 'main'
}
from {configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it)}}
}
谢谢你的回复。我需要添加doLast{subprojects.each…}来让它工作。但是生成的jar只包含清单文件。你知道我做错了什么吗?我对gradle还是个新手,如果我直接在根项目的build.gradle中添加fatJar任务(在所有项目{}或子项目{}中没有嵌套),生成的jar只包含清单。我还尝试了此处解释的解决方案:。尽管这种方法可行,但它会在每个子文件夹中创建一个补足jar,因此需要相当长的时间来构建。我不认为这是一条路。所以我还在找一个更好的。