从单个项目源构建多个jar

时间:2013-03-21 22:56:28

标签: gradle

我相当陌生。

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

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

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

1 个答案:

答案 0 :(得分: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

<强> 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
  • 的依赖关系