一尘不染

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

spring-boot

作为一家企业,我们希望在PCF实例内部托管Initializr,我可以这样做。我还能够将application.yml修改为默认的一些选择。

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

我有两个主要问题:

  1. UI首次出现时,UI上是否有一种方法可以默认选择某些依赖项(例如,预先选择“ Web&Security”)?
  2. 我可以自定义世代的输出吗?例如,我们有自己的Gradle自定义发行版,并且希望生成的build.gradle文件看起来与initializr生成的文件有所不同。我们还想生成gradle.properties文件作为项目的一部分。

阅读 1103

收藏
2020-05-30

共1个答案

一尘不染

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

是的,这在自定义实例中是可能的。实现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);
    }
}

它们不会在用户界面中被选中,但是它们将被集成到项目中,就像用户选择它们一样。我之所以推荐这种方法,是因为IDE集成可以以与主实例(start.spring.io)相同的方式来定位您的自定义实例。破解Web
UI只会使该特定的客户端(IMO)有问题。

对于第二个问题,大多数fork都会从中扩展ProjectGenerator并执行所需的任何操作(包括覆盖gradle构建)。检查该类以获取更多详细信息。

Spring Initializr尚未达到1.0,因此尚未处于合同足够成熟的状态。

2020-05-30