5

我对gradle还很陌生。

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

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

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

4

1 回答 1

6

实现您想要的一种干净的方法是创建一个多项目构建,其中包含两个子项目(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

设置.gradle

include ':foobase', ':foo2'

构建.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
于 2013-03-26T20:25:01.940 回答