gradle - 从单个项目源构建多个 jar

标签 gradle

我对 gradle 相当陌生。

我想知道是否可以从同一个项目源构建多个 jar。我浏览过以前的类似问题,但我的情况有点不同。我想将所有源文件编译两次以生成两个不同的 jar,每个都有不同的依赖项和不同的工件 ID。从概念上讲,它可以表示如下:

  • 项目“FooBase”
  • src/main/java/...
  • 取决于库 Bar 版本 1.0.0
  • 编译所有源代码并生成“org.foo/Foo1”(组/工件)
  • 项目“Foo2”
  • 没有自己的来源,或者可以添加来源
  • 取决于库 Bar 版本 2.0.0
  • 编译“FooBase”及其源中的所有源代码,并生成“org.foo/Foo2”(组/工件)

  • 使用 gradle 可以进行这种构建吗?最好的方法是什么?谢谢!

    最佳答案

    实现您想要的一种干净的方法是创建一个多项目构建,带有两个子项目(foobase 和 foo2),其中 foo2 的源集被配置为包含 foobase 的源集以及它自己的源。

    要获得工件的不同依赖项,您只需要声明 dependencies在子项目中有不同的部分。

    为了测试这一点,我创建了一个多项目构建,每个子项目中都有一个 java 文件。为了简化这里的输出,根 build.gradle文件包含所有内容,包括子项目特定的自定义。但在“现实生活”中,我总是将子项目特定的配置放在 build.gradle 中。文件在正确的子项目级别。

    gradle 构建文件包含

  • 将源集从 foobase 添加到 foo2
  • 两个项目的依赖不同
  • 部署到本地 maven 存储库(以验证是否正确创建了 pom)
  • IntelliJ IDEA 和 Eclipse 的可选 IDE 插件

  • 总而言之,我最终得到了以下结果:

    项目结构
    build.gradle                      => root project build file
    settings.gradle                   => specification of included subprojects
    foo2\                             => foo2 subproject folder
      src\
        main\
          java\
            Foo2.java                 => Empty class
    foobase\                          => foobase subproject folder
      src\
        main\
          java\
            FooBase.java              => Empty class
    

    settings.gradle
    include ':foobase', ':foo2'
    

    build.gradle
    allprojects {
        apply plugin: 'idea'
        apply plugin: 'eclipse'
        group = 'org.foo'
        version = '1.0'
    }
    
    subprojects {
        apply plugin: 'java'
        apply plugin: 'maven'
    
        repositories {
            mavenCentral()
        }
    
        uploadArchives {
            it.repositories.mavenDeployer {
                repository(url: "file:///tmp/maven-repo/")
            }
        }
    }
    
    project(':foobase') {
        dependencies {
            compile 'log4j:log4j:1.2.13'
        }
    }
    
    project(':foo2') {
        dependencies {
            compile 'log4j:log4j:1.2.16'
        }
    
        sourceSets.main.java.srcDirs        project(':foobase').sourceSets.main.java
        sourceSets.main.resources.srcDirs   project(':foobase').sourceSets.main.resources
        sourceSets.test.java.srcDirs        project(':foobase').sourceSets.test.java
        sourceSets.test.resources.srcDirs   project(':foobase').sourceSets.test.resources
    }
    

    请注意,我还添加了资源和测试的源目录。如果不需要,您可以省略最后三行。

    要验证构建:
  • 确保这两个 jar 文件包含所有需要的类。
  • 验证两个部署的 maven pom 是否具有正确的依赖项。

  • 就我而言:
  • foobase-1.0.jar仅包含 FooBase.class
  • foo2-1.0.jar包含两个 FooBase.classFoo2.class
  • 已上传 foobase-1.0.pom包含对 log4j-1.2.13 的依赖
  • 已上传 foo2-1.0.pom包含对 log4j-1.2.16 的依赖
  • 关于gradle - 从单个项目源构建多个 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15559753/

    相关文章:

    java - 如何使用 Gradle 更改 Android 风格应用程序的包名称?

    android - 带有美元符号的 Gradle 错误

    gradle - 带有gradle的Java 11:必须指定绝对路径,但必须为$ {tools.jar}

    gradle - 创建文件后gradle出版物

    gradle - Groovy语法称为什么(例如Gradt 'exclude'闭合语法)?

    gradle - 删除不包含gradle中文件的子目录

    java - LibGDX - 多台机器上的库

    android - Gradle 3.0 BuildException 无法创建目录

    gradle - gradle删除主要源集

    android-studio - Android Studio 3.1.1 - 无法添加模块(导入 gradle 项目)