Gradle:将多个项目打包到一个jar中

2024-04-09

我有一个 gradle 多项目,想要创建一个包含子项目和外部依赖项的所有类的单个 jar (库)。

我有以下项目结构。每个项目都有自己的第 3 方依赖项。常见的依赖项包含在根项目中。两个模块A和B都依赖于核心。

+ 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
}

此方法有效,但仅收集项目源文件。忽略第 3 方依赖项。所以我尝试了 Shadow 插件(http://imperceptiblethoughts.com/shadow/ http://imperceptiblethoughts.com/shadow/)其中还应该包括外部依赖项。

不幸的是,该插件根本不收集任何东西。这很可能是由于根项目及其子项目之间缺少依赖关系所致。我如何告诉影子插件它应该收集子项目的来源?或者是否有更好的方法从多个项目中导出单个库?

使用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"

感谢您的帮助!


我用这里解释的解决方案解决了我的问题:https://discuss.gradle.org/t/how-to-get-gradle-install-to-actually-bundle-all-project-subproject-classes-resources-etc/12070/4 https://discuss.gradle.org/t/how-to-get-gradle-install-to-actually-bundle-all-project-subproject-classes-resources-etc/12070/4

我的 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) } }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gradle:将多个项目打包到一个jar中 的相关文章

随机推荐

  • Grails 3 和 Spring @RequestMapping

    在 Grails 3 中 我尝试使用 spring security oauth 它通过 RequestMapping 提供了一些端点 我可以在 mbean 中看到路径已配置 但任何请求总是会命中 grails 并返回 404 这些请求似乎
  • 如何序列化 Jackson 的 JsonNode 对象?

    我正在用 memcached 替换内部缓存系统 但 memcached 客户端无法缓存JsonNode对象 因为它们没有实现Serializable 有什么方法可以实现序列化JsonNode目的 杰克逊提供吗Serializable相当于这
  • python中,按日期字段排序,字段有时可能为null

    我很难想出一个巧妙的方法来处理这种情况 我有从数据库读取回来的数据 我想按会计日期排序 然而 accoutingdate 有时可能为空 我目前正在做以下事情 results sorted results key operator itemg
  • Rails - 禁用选择中的选项(根据条件)

    我已经选择 f select category id categories html options gt class gt select box disabled gt true if category id 18 上面的代码显然返回一个
  • Highcharts 反转折线图在最小值处部分隐藏

    当使用具有最小值和最大值的反向折线图时 线条在最小值处部分隐藏 问题在于绘图画布恰好在最小值线处结束 当一条粗线只有一部分可见时 位于最小值线上方的部分将被隐藏 你可以看一个例子here http jsfiddle net DruGa 2
  • 等待进程组时 waitpid() 无子进程错误

    编写我自己的玩具外壳 并在尝试实现作业控制时遇到了障碍 我正在使用 setpgid 在子进程和父进程中设置子进程组 我的等待电话是 pid waitpid pid status 0 然而 waitpid 返回 1 并且 perror 说 没
  • 从 unicode 字符串中去除特殊字符和标点符号

    我正在尝试从 unicode 字符串中删除标点符号 该字符串可能包含非 ASCII 字母 我尝试使用regex module import regex text u lt ik gt regex sub ur p P text 然而 我注意
  • Julia DataFrames 中的高效自定义排序?

    有没有一种快速的方法来指定自定义订单sort sort 在 Julia 数据框架上 julia gt using DataFrames julia gt srand 1 julia gt df DataFrame x rand 10 y r
  • WS02 ESB 中的 HL7 传输安全吗?

    我的小组正在评估 HL7 代理并遇到了 WS02 ESB 我已经成功配置了一个看起来运行良好的 HL7 代理 现在我的任务是使用 SSL 特别是 TLS 保护监听点 这似乎是 ESB 应该能够处理的事情 它可以执行 HTTPS 安全 Web
  • EditText android:提示不会在焦点上消失

    我使用的是 Android 4 我正在尝试向我的编辑文本小部件添加提示 我尝试将提示添加到布局中 如下所示
  • Bootstrap 4 - 垂直居中列表项

    我有一个使用 Bootstrap 4 beta 的网页 在此页面中 我有一个内联列表 我希望每个列表项的内容垂直居中 以便项目对齐 如图所示Bootply https www bootply com od2qnkLIkQ 它们目前偏离中心
  • Heroku:错误 R10(启动超时)-> Web 进程无法在启动后 60 秒内绑定到 $PORT - Python

    我正在尝试托管一个使用张量流到heroku的瓶子应用程序 应用程序启动 我得到了 服务器在端口上运行 以及 但应用程序未打开 大约一分钟后 它显示以下跟踪 打开跟踪表明服务器运行成功 2018 08 25T19 46 55 651043 0
  • Symfony 内存问题

    我在 symfony 和 cpu 内存泄漏方面遇到了困难 我是 symfony 的新手 我不知道我是否弄乱了任何技巧或技术来克服这个问题 我在 vps 上托管我当前的 symfony 项目 它几乎每隔一小时就会停止一次 我也想知道这些问题的
  • 如何在jquery中将html2canvas图像保存到系统文件夹中

    我有一个 id form1 的表单 在这个表单中我有一个图表 现在我使用 html2canvas 来获取此 form1 的图像 这是我的代码
  • 带有图标相对路径的 Windows 快捷方式

    有没有办法设置Windows快捷方式中图标的相对路径 对于目标位置 它工作正常 windir system32 cmd exe c cd CD start fileToExecute bat 我读到 win 快捷方式可以自动从 exe 文件
  • Android JavaCV 困境,创建 IplImage 时在“draw”方法中抛出 NoClassDefFoundError

    我正在使用 JavaCV 库和针对 Android 的预构建 OpenCV 库 我认为我已经以正确的方式设置了 Eclipse 因为我已经包含了 javacv jar 和 javacpp jar 两个 jar 另外 java cv andr
  • 如何将项目添加到SqlDataSource数据绑定列表

    我很懒 我正在使用 SQLDataSource 来填充我的下拉列表 数据绑定对象的 Databind 事件在 Page PreRender 之前调用 因此我在 PreRender 事件处理程序中执行类似的操作 private void In
  • assertThat - hamcrest - 检查列表是否已排序

    好吧 我认为这将是一个简短的问题 我有一个按日期排序的 ArrayList 当然我看到它有效 但我也想为它编写一个测试 我想检查列表中的下一个值 日期 是否低于前一个值 我可以使用一些来做到这一点fors 并添加临时列表 但我想知道是否有更
  • 如何使用 WiX 安装和启动 Windows 服务

    我尝试在 Wix 中使用下面的代码 但是在安装时 安装程 序在 正在启动服务 状态下冻结了大约 3 分钟 然后我收到此消息 Service Jobservice 无法启动 请验证您是否有足够的权限来启动系统服务 我的代码有什么错误吗 并且可
  • Gradle:将多个项目打包到一个jar中

    我有一个 gradle 多项目 想要创建一个包含子项目和外部依赖项的所有类的单个 jar 库 我有以下项目结构 每个项目都有自己的第 3 方依赖项 常见的依赖项包含在根项目中 两个模块A和B都依赖于核心 root project only