首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring 2与分级-构建/编译不同版本(Basic,Pro,终极)从一个单一的代码基

Spring 2与分级-构建/编译不同版本(Basic,Pro,终极)从一个单一的代码基
EN

Stack Overflow用户
提问于 2021-05-06 11:41:11
回答 1查看 73关注 0票数 0

项目详细信息

我有一个以Gradle为构建工具的spring 2项目。我使用Java 8作为java版本。模板引擎的Thymeleaf。

我的目标

我想建立不同的版本,如基础版本,专业版和终极版。举个例子,假设Base有5个特性。Pro版本拥有基础版本的所有功能,并增加了5个功能。而最终版本有所有的功能,专业版与额外的5个功能。

我想过的解决方案和互联网搜索解决方案

  1. 为不同版本保留了不同的分支。但这里的问题是如何实际管理代码库、修补补丁以及带来新特性等。我也搜索过这种方法,但所有人都说不要使用这种方法,因为这不是一个好的选择。
  2. 使用Gradle构建多个版本。我知道在Android中有一些特性可以构建多种风格的应用程序,比如用于开发、QA和生产。Spring是否有任何特性可用于使editions.
  3. Using具有某种配置。我们可以基于这个配置文件来切换/关闭基于版本的特性。但这很容易被黑。所以我不敢使用它。
  4. 使用许可。这与第3点相同,但略有不同的是,java的different.
  5. Using模块特性(显然,我必须升级我的java版本)使用一些Gradle配置。在构建时,我们可以包括基于

的模块

那么我如何创建不同的版本呢?在这种情况下,在每个版本与其前任版本共享一些共同特性的情况下,制作不同版本的最佳解决方案是什么?

请考虑一下,我想要一个单一的代码库。因此,当它们共享一些共同的代码/特性时,进行bug修复就很容易了。

EN

回答 1

Stack Overflow用户

发布于 2021-05-06 12:55:31

下面是使用依赖关系和Java的SPI可以做的一些事情..。

您可以在某个核心模块中定义一个提供者接口(在这里我称之为": core ")

代码语言:javascript
复制
package com.example;

interface FlavorProvider {

    String getFlavor();

}

然后在basic模块中定义这方面的实现:

代码语言:javascript
复制
package com.example;

public class BasicFlavorProvider implements FlavorProvider {

    @Override
    public String getFlavor() {
        return "BASIC!";
    }

}

与包含行resources/META-INF/services/com.example.FlavorProvider的文件com.example.BasicFlavorProvider一起使用。

pro模块中的另一个模块

代码语言:javascript
复制
package com.example;

public class ProFlavorProvider implements FlavorProvider {

    @Override
    public String getFlavor() {
        return "PRO!";
    }
}

与包含行resources/META-INF/services/com.example.FlavorProvider的文件com.example.ProFlavorProvider一起使用。

然后,在应用程序中,可以根据项目属性将任意一个模块作为依赖项包括在内:

代码语言:javascript
复制
    implementation(project(":core"))
    if (project.hasProperty("pro")) {
        implementation(project(":pro"))
    } else {
        implementation(project(":basic"))
    }

在你的主修课上,你可以:

代码语言:javascript
复制
package com.example;

import java.util.ServiceLoader;

public class Main {

    private final ServiceLoader<FlavorProvider> provider = ServiceLoader.load(FlavorProvider.class);

    public static void main(String[] args) {
        new Main().run();
    }

    private void run() {
        provider.forEach(p -> System.out.println(p.getFlavor()));
    }
}

然后:

代码语言:javascript
复制
➜ ./gradlew app:run

> Task :app:run
BASIC!

和:

代码语言:javascript
复制
➜ ./gradlew app:run -Ppro

> Task :app:run
PRO!

YMMV,这没有考虑到Spring

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67417418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档