java - 如何通过 gradle 打包 REST 客户端代码以供多项目使用

标签 java gradle

背景:

在项目 Alpha 需要在项目 Beta 中使用 REST 端点的多项目(比如 Alpha 和 Beta)Java/Spring4.x 环境中。项目 Alpha 和 Beta 非常相关,并且将始终一起发布。但是,它们也需要分开,因为代码将被构建到不同的部分中,这些部分将在不同的物理机器上执行——因此首先是 REST 实现!

附带一点:UI 代码在其他项目中,通常是各种 REST 端点的使用者,因此不需要使用 REST 客户端的 Java 实现。 REST 客户端通常是 src/main/test,因此它们甚至没有被打包,通常它们只是为单元测试创​​建的。

规范:

给定的 API 在 Project Beta 中通过接口(interface)类定义:

// located in /src/main/java/com/mycompany/myservice/api
public interface MyServiceApi {
    String getDataMethod();
}

Java REST Client 目前也处于 Project Beta 中(需要上面的 API):
// currently located in /src/main/client/com/mycompany/myservice/client
public class MyServiceRestClient implements MyServiceApi {
    . . . 
}

问题:

抱歉花了这么长时间才到这里!两个项目都在同一个 settings.gradle 文件中定义——它们是一起构建的。每个项目也有自己的 build.gradle 文件。问题是如何仅打包客户端 REST 工件,然后如何在 Project Alpha 中引用它们?理想情况下,答案既可以从 gradle 命令行也可以在 Eclipse 中使用。显然,在 Project Alpha 的 build.gradle 中使用它:
dependencies {
    compile project('beta')
}

不起作用,因为这会带来所有项目 Beta。通过将客户端 Java 代码放入 src/main/client,我一直假设 Project Beta 将需要定义一个 sourceSet 来处理此代码。我怎么拿,把它打包成一个 jar (我知道怎么做这部分),最重要的是 ,引用来自 Project Alpha 的 Jar 都在同一个、单个多项目 gradle 构建中?还是有更好的方法来做到这一点,这是一种完全不同的方法?

最佳答案

我想我刚刚找到了答案——我不知道在定义“项目”依赖项时,您可以通过包含特定配置来进行优化!

所以我想我可以在 Alpha 中做这样的事情(其中 Beta 定义了引用的配置):

dependencies {
    compile project('Beta') {
        configuration = 'RESTclient'
    }
}

我现在正在对此进行测试,如果它正常工作,我将编辑这个答案。

更新

如果您需要,上述方法可以正常工作。我需要一些不同的东西。 Project Beta 提供了 Project Alpha 所需的 REST 客户端。首先,我将它打包到 Project beta 中的“客户端”jar 文件中:
clientJar {
    // ensure the client jar file is relatively self-contained, so add API class
    // Note: this is additive, so the client configuration class files are already in the jar
    from sourceSets.main.output.asFileTree.matching {
        include 'com/mycompany/package/path/api/**'
}

}

然后在 Project Alpha 中有两个选择。首先直接使用 Project Beta 中的客户端类文件:
jar {

    from project(':Beta').sourceSets.client.output.classesDir
    . . .
}

或者,Alpha 中的另一个选项是引用创建的 Jar 文件:
dependencies {
    . . .

    compile "com.mycompany.project.path:beta:${version}:client"
}

YMMV,但通常我更喜欢后一种方法。

关于java - 如何通过 gradle 打包 REST 客户端代码以供多项目使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26382845/

相关文章:

java - Swing 星级

java - 使用 Java 将 Oracle 数据库迁移到 MS Access 的最佳方法是什么?

java - Gradle 任务缺少 jar 文件的主类

android - 如何从应用程序中删除额外的 native 依赖项?

java - 找出构造了哪个枚举值

java - 如何自定义 Spring security Authentication 以使用 3 个参数?

java - 如何在 java 中创建自定义编译器警告?

gradle - 如何将命令传递给includeproject的build.gradle

java - 在 IntelliJ 中创建 gradle 项目的问题

gradle - 在插件中扩展TestCompile和TestRuntime