项目详细信息
我有一个以Gradle为构建工具的spring 2项目。我使用Java 8作为java版本。模板引擎的Thymeleaf。
我的目标
我想建立不同的版本,如基础版本,专业版和终极版。举个例子,假设Base有5个特性。Pro版本拥有基础版本的所有功能,并增加了5个功能。而最终版本有所有的功能,专业版与额外的5个功能。
我想过的解决方案和互联网搜索解决方案
的模块
那么我如何创建不同的版本呢?在这种情况下,在每个版本与其前任版本共享一些共同特性的情况下,制作不同版本的最佳解决方案是什么?
请考虑一下,我想要一个单一的代码库。因此,当它们共享一些共同的代码/特性时,进行bug修复就很容易了。
发布于 2021-05-06 12:55:31
下面是使用依赖关系和Java的SPI可以做的一些事情..。
您可以在某个核心模块中定义一个提供者接口(在这里我称之为": core ")
package com.example;
interface FlavorProvider {
String getFlavor();
}然后在basic模块中定义这方面的实现:
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模块中的另一个模块
package com.example;
public class ProFlavorProvider implements FlavorProvider {
@Override
public String getFlavor() {
return "PRO!";
}
}与包含行resources/META-INF/services/com.example.FlavorProvider的文件com.example.ProFlavorProvider一起使用。
然后,在应用程序中,可以根据项目属性将任意一个模块作为依赖项包括在内:
implementation(project(":core"))
if (project.hasProperty("pro")) {
implementation(project(":pro"))
} else {
implementation(project(":basic"))
}在你的主修课上,你可以:
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()));
}
}然后:
➜ ./gradlew app:run
> Task :app:run
BASIC!和:
➜ ./gradlew app:run -Ppro
> Task :app:run
PRO!YMMV,这没有考虑到Spring
https://stackoverflow.com/questions/67417418
复制相似问题