无法使用 Gradle 在 SpringBoot 闭包中设置 Layout = ZIP

Jee*_*eef 1 spring gradle spring-boot

这是对我之前问过的一个问题的跟进。我正在尝试获得一个 SpringBoot 构建设置,我可以在其中使用propertiesLauncher. 根据我需要给我们布局的文档ZIP

因此,当我将以下块添加到 gradle 时:

springBoot{
    layout='ZIP'
}
Run Code Online (Sandbox Code Playgroud)

我在构建时收到以下错误:

无法为 org.gradle.api.Project 类型的根项目“演示”设置只读属性“布局”的值。

* What went wrong:
A problem occurred evaluating root project 'demo'.
> Cannot set the value of read-only property 'layout' for root project 'demo' of type org.gradle.api.Project.

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Run Code Online (Sandbox Code Playgroud)

我假设我在这里遗漏了一些简单的东西。所以我的问题如下:

1)我需要做什么才能编译

2)我是否可以不使用 SpringDependencyManagement 插件来做到这一点,因为我希望使用 Gradle 的原生 BOM 支持

谢谢,

一个示例项目在这里:https : //github.com/jeeftor/spring-boot-layout

而 build.gradle 看起来像:

plugins {
    id 'org.springframework.boot' version '2.1.9.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

group = 'org.confused'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

springBoot{
    layout='ZIP'
}

Run Code Online (Sandbox Code Playgroud)

Bjø*_*ter 5

当你写:

springBoot{
    layout='ZIP'
}
Run Code Online (Sandbox Code Playgroud)

您正在为 springBoot 扩展提供一个闭包,并且您在此处编写的任何内容都将针对扩展本身进行解析,或者针对在这种情况下是 Gradle Project 类的周围范围进行解析。

发生的情况是您尝试设置一个layout您期望在扩展中的变量,但事实并非如此。相反,恰好在 Gradle类中有一个同名变量Project。而且这个变量是只读的,这就是 Gradle 抱怨的原因。当然,这不是您打算首先使用的。

所以现在您可能会问为什么layoutspringBoot 扩展中没有文档中所说的变量。答案是您正在查看 Spring Boot 1.4 的文档,而您正在使用 Spring Boot 2.1。如果您转到您正在使用的版本文档,您将看到不再有布局属性。相反,如果您想创建应用程序的 zip 发行版,则可以使用该application插件。但这不会使它使用 PropertiesLauncher。

Gradle 插件没有关于如何使用 PropertiesLauncher 的任何文档,但是如果您使用可执行 jar 格式(您也可以使用可执行 war),它看起来像这样:

bootJar {
    manifest {
        attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用java -Dloader.path=path/to/extra/jars -jar demo-0.0.1-SNAPSHOT.jar、环境变量或文档中指定的其他方法之一加载额外的 jar 。请注意,您不能在bootRun不进行额外调整的情况下使用该任务,因为它不使用 PropertiesLauncher。

您还询问了如何在 Gradle 中使用本机 BOM 支持。您可以删除io.spring.dependency-management插件,而是使用这样的平台依赖项:

dependencies {
    implementation platform(group: 'org.springframework.boot', name: 'spring-boot-dependencies', version: '2.1.9.RELEASE')
}
Run Code Online (Sandbox Code Playgroud)