自定义 spring-initializr 的工作方式?

Eri*_*ric 5 spring spring-boot

作为一家企业,我们希望在我们的 PCF 实例上内部托管初始化程序,我可以做到。我还能够修改 application.yml 以默认某些选择。

我通过简单地创建我自己的 spring-boot 应用程序来做到这一点,该应用程序使用 io.spring.initializr:initializr-web:0.3.0.RELEASE 作为运行时依赖项。

我有两个主要问题:

  1. 当用户界面第一次出现时,用户界面上有没有办法默认选择某些依赖项(例如,预先选择网络和安全)?
  2. 我可以自定义生成的输出吗?例如,我们有自己的 Gradle 自定义发行版,并且希望生成的 build.gradle 文件看起来与 initializr 生成的有点不同。我们还想生成一个 gradle.properties 文件作为项目的一部分。

Ste*_*oll 4

有一个参考指南可以引导您创建自己的实例。关于您的主要问题:

是的,这在自定义实例中是可能的。实现ProjectRequestPostProcessor这两个依赖项并将其添加到项目中。

@Component
class PreselectedDependenciesRequestPostProcessor implements ProjectRequestPostProcessor {

    private final InitializrMetadataProvider metadataProvider;

    public PreselectedDependenciesRequestPostProcessor(
            InitializrMetadataProvider metadataProvider) {
        this.metadataProvider = metadataProvider;
    }

    @Override
    public void postProcessAfterResolution(ProjectRequest request,
            InitializrMetadata metadata) {
        DependenciesCapability dependencies = metadataProvider.get().getDependencies();
        if (!hasDependencies(request, "web")) {
            request.getResolvedDependencies().add(dependencies.get("web"));
        }
        if (!hasDependencies(request, "security")) {
            request.getResolvedDependencies().add(dependencies.get("security"));
        }
    }

    private boolean hasDependencies(ProjectRequest request, String... dependenciesId) {
        for (String id : dependenciesId) {
            if (getDependency(request, id) == null) {
                return false;
            }
        }
        return true;
    }

    private Dependency getDependency(ProjectRequest request, String id) {
        return request.getResolvedDependencies().stream()
                .filter(d -> id.equals(d.getId())).findFirst().orElse(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

它们不会在 UI 中被选择,但会像用户选择它们一样集成到项目中。我推荐这种方法的原因是您的自定义实例可以通过 IDE 集成以与主 (start.spring.io) 实例相同的方式定位。破解 Web UI 只会使该功能适用​​于特定客户端,在我看来,这是一个问题。

对于第二个问题,大多数 fork 都会扩展ProjectGenerator并做任何他们想做的事情(包括覆盖 gradle 构建)。检查该类以获取更多详细信息。

Spring Initializr 还没有达到 1.0,所以它还没有处于合约足够成熟的状态。