依赖管理插件使用方法笔记
依赖管理插件是什么?
正在Spring项目中开发的Gradle插件,目的是使Gradle能够使用与Maven的BOM相同的机制。
当你想在Gradle中使用BOM时,最好使用Spring团队提供的Dependency Management插件来解释BOM的用途-请参考一些构建指南。
最初,Spring Boot 1.x 版本時,它是Spring Boot插件的一部分,但在Spring Boot升级到2.x时,它作为一个独立的插件被分离出来。
因此,它可以独立于Spring Boot使用(但实际上,我认为在使用Spring Boot时它是最为有帮助的)。
环境
Gradle 基于本地环境进行构建与编译的工具。
5.4.1 五点四点一
依赖管理插件
1.0.8.RELEASE 的释放版本。
你好,世界。
plugins {
id "java"
id "io.spring.dependency-management" version "1.0.8.RELEASE"
}
repositories {
mavenCentral()
}
dependencyManagement {
dependencies {
dependency "org.apache.commons:commons-lang3:3.9"
}
}
dependencies {
implementation "org.apache.commons:commons-lang3"
}
sourceCompatibility = 11
targetCompatibility = 11
compileJava.options.encoding = "UTF-8"
- plugins DSL を使わない書き方は https://plugins.gradle.org/plugin/io.spring.dependency-management とかを参照。
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.commons:commons-lang3 -> 3.9
解释
dependencyManagement {
dependencies {
dependency "org.apache.commons:commons-lang3:3.9"
}
}
dependencyManagement の dependencies で、依存ライブラリをバージョンまで宣言する
dependencies {
implementation "org.apache.commons:commons-lang3"
}
-
- すると、プロジェクトの通常の依存関係の定義からバージョンの記述を省略できるようになる
- この場合は、 dependencyManagement で宣言したバージョンがデフォルトで使用されるようになる
一次宣布同一组的多个艺术品的版本。
...
dependencyManagement {
dependencies {
dependencySet(group: "org.apache.poi", version: "4.1.0") {
entry "poi"
entry "poi-ooxml"
}
}
}
dependencies {
implementation "org.apache.poi:poi"
implementation "org.apache.poi:poi-ooxml"
}
...
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.apache.poi:poi -> 4.1.0
| +--- commons-codec:commons-codec:1.12
| +--- org.apache.commons:commons-collections4:4.3
| \--- org.apache.commons:commons-math3:3.6.1
\--- org.apache.poi:poi-ooxml -> 4.1.0
+--- org.apache.poi:poi:4.1.0 (*)
+--- org.apache.poi:poi-ooxml-schemas:4.1.0
| \--- org.apache.xmlbeans:xmlbeans:3.1.0
+--- org.apache.commons:commons-compress:1.18
\--- com.github.virtuald:curvesapi:1.06
解释
说明
dependencyManagement {
dependencies {
dependencySet(group: "org.apache.poi", version: "4.1.0") {
entry "poi"
entry "poi-ooxml"
}
}
}
dependencySet を使うと、同じグループの複数のアーティファクトのバージョンを一括で指定できる
グループは org.apache.poi で、アーティファクトは poi と poi-ooxml
バージョンに 4.1.0 を指定している
从流动的依赖关系中排除特定的库。
...
dependencyManagement {
dependencies {
dependency("org.apache.poi:poi:4.1.0") {
exclude "commons-codec:commons-codec"
}
}
}
dependencies {
implementation "org.apache.poi:poi"
}
...
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.poi:poi -> 4.1.0
+--- org.apache.commons:commons-collections4:4.3
\--- org.apache.commons:commons-math3:3.6.1
- 前節の依存関係のグラフと比較すると、 commons-codec が無くなっているのが分かる
解释
dependencyManagement {
dependencies {
dependency("org.apache.poi:poi:4.1.0") {
exclude "commons-codec:commons-codec"
}
}
}
exclude() を使うことで、推移的な依存関係の中にある特定のライブラリを除外できる
如果通过dependencySet进行指定的情况下。
...
dependencyManagement {
dependencies {
dependencySet(group: "org.apache.poi", version: "4.1.0") {
entry("poi") {
exclude "commons-codec:commons-codec"
}
entry "poi-ooxml"
}
}
}
dependencies {
implementation "org.apache.poi:poi"
implementation "org.apache.poi:poi-ooxml"
}
...
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.apache.poi:poi -> 4.1.0
| +--- org.apache.commons:commons-collections4:4.3
| \--- org.apache.commons:commons-math3:3.6.1
\--- org.apache.poi:poi-ooxml -> 4.1.0
+--- org.apache.poi:poi:4.1.0 (*)
+--- org.apache.poi:poi-ooxml-schemas:4.1.0
| \--- org.apache.xmlbeans:xmlbeans:3.1.0
+--- org.apache.commons:commons-compress:1.18
\--- com.github.virtuald:curvesapi:1.06
加载BOM
...
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
}
}
dependencies {
implementation "org.apache.commons:commons-lang3"
}
...
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.commons:commons-lang3 -> 3.8.1
解释
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
}
}
imports の mavenBom で、 Maven の BOM を読み込むことができる
ここでは Spring Boot 2.1.6.RELEASE の BOM を読み込んでいる
2.1.6.RELEASE の BOM で指定されている commons-lang3 のバージョンは 3.8.1 なので、解決されたバージョンも 3.8.1 になっている
複数の BOM をインポートすることもできる
その場合、同じアーティファクトのバージョンは最後にインポートした BOM の宣言が使用される
覆盖声明为BOM的版本。
覆盖版本属性
...
dependencyManagement {
dependencies {
imports {
mavenBom("org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE") {
bomProperty "commons-lang3.version", "3.9"
}
}
}
}
dependencies {
implementation "org.apache.commons:commons-lang3"
}
...
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.commons:commons-lang3 -> 3.9
说明
mavenBom("org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE") {
bomProperty "commons-lang3.version", "3.9"
}
-
- Maven BOM 上でプロパティを使ってバージョンが宣言されている場合、そのプロパティの値を上書きすることでバージョンを変更できる
Spring Boot の BOM では、 commons-lang3 のバージョンは commons-lang3.version というプロパティで宣言されている
ただし、この方法はMaven プラグインで pom.xml を出力しない場合にのみ使用すべき
なぜなら、この方法だと出力される pom.xml にはバージョンを上書きしているという情報が反映されないため
还可以使用bomProperties(Map)方法进行编写。
dependencyManagement {
dependencies {
imports {
mavenBom("org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE") {
bomProperties([
"commons-lang3.version": "3.9",
"commons-pool2.version": "2.6.1"
])
}
}
}
}
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.apache.commons:commons-lang3 -> 3.9
\--- org.apache.commons:commons-pool2 -> 2.6.1
还有一种方法可以通过扩展属性进行声明。
ext["commons-lang3.version"] = "3.8"
ext["commons-pool2.version"] = "2.6.0"
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
}
}
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.apache.commons:commons-lang3 -> 3.8
\--- org.apache.commons:commons-pool2 -> 2.6.0
覆盖依赖管理
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
dependency "org.apache.commons:commons-lang3:3.9"
}
}
dependencies {
implementation "org.apache.commons:commons-lang3"
}
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.commons:commons-lang3 -> 3.9
解释
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
dependency "org.apache.commons:commons-lang3:3.9"
}
}
dependency で宣言することで、 BOM で宣言されたバージョンを上書きできる
dependency で宣言されたバージョンは、 BOM で宣言されたものよりも優先される
imports より上で dependency を宣言しても結果は同じになる
この方法なら、 Maven プラグインで出力される pom.xml にもバージョンを上書きする内容が反映される
可以通过通常指定版本来覆盖声明依赖关系。
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
dependency "org.apache.commons:commons-lang3:3.9"
dependency "org.apache.commons:commons-pool2:2.6.1"
}
}
dependencies {
implementation "org.apache.commons:commons-lang3" // バージョン指定しない場合
implementation "org.apache.commons:commons-pool2:2.6.0" // バージョン指定した場合
}
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.apache.commons:commons-lang3 -> 3.9
\--- org.apache.commons:commons-pool2:2.6.0
implementation でバージョンを直接指定した場合は、そのバージョンが採用されている(dependency よりも優先されている)
如果希望在依赖关系声明中直接指定的版本被忽略的话,可以将 overriddenByDependencies 选项设置为 false。
dependencyManagement {
overriddenByDependencies = false
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
dependency "org.apache.commons:commons-lang3:3.9"
dependency "org.apache.commons:commons-pool2:2.6.1"
}
}
dependencies {
implementation "org.apache.commons:commons-lang3"
implementation "org.apache.commons:commons-pool2:2.6.0"
}
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.apache.commons:commons-lang3 -> 3.9
\--- org.apache.commons:commons-pool2:2.6.0 -> 2.6.1
- 直接指定した 2.6.0 は無視されて、 dependency で指定した 2.6.1 が採用された
查看已加载的BOM属性。
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
}
}
task showBomProperty {
doFirst {
println "commons-lang3.version = ${dependencyManagement.importedProperties["commons-lang3.version"]}"
}
}
> gradle showBomProperty
...
commons-lang3.version = 3.8.1
解释
task showBomProperty {
doFirst {
println "commons-lang3.version = ${dependencyManagement.importedProperties['commons-lang3.version']}"
}
}
- 読み込んだ BOM のプロパティは、 dependencyManagement.importedProperties から取得できる
除外
首先,尝试声明对commons-dbcp2的依赖,而不加载Spring Boot的BOM。
plugins {
id "java"
}
repositories {
mavenCentral()
}
dependencies {
implementation "org.apache.commons:commons-dbcp2:2.5.0"
}
...
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.commons:commons-dbcp2:2.5.0
+--- org.apache.commons:commons-pool2:2.6.0
\--- commons-logging:commons-logging:1.2
可以看出存在对commons-logging的依赖。
接下来,尝试加载Spring Boot的BOM。
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
}
}
dependencies {
implementation "org.apache.commons:commons-dbcp2"
}
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.commons:commons-dbcp2 -> 2.5.0
\--- org.apache.commons:commons-pool2:2.6.0 -> 2.6.2
可以看出不再依赖于commons-logging。
这是由于在Spring Boot中的BOM中明确排除了对commons-logging的依赖所导致的。
如果想要停止这种行为(即使被指定为 BOM 的排除项,也希望将其包含为依赖项),请将 applyMavenExclusions 设置为 false。
dependencyManagement {
applyMavenExclusions = false
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
}
}
dependencies {
implementation "org.apache.commons:commons-dbcp2"
}
> gradle dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
\--- org.apache.commons:commons-dbcp2 -> 2.5.0
+--- org.apache.commons:commons-pool2:2.6.0 -> 2.6.2
\--- commons-logging:commons-logging:1.2
commons-logging 的依赖已经重新出现。
为每个配置进行设置
configurations {
hoge
fuga
piyo
}
dependencyManagement {
dependencies {
dependency "org.apache.commons:commons-lang3:3.9"
}
hoge {
dependencies {
dependency "org.apache.commons:commons-lang3:3.8"
}
}
fuga {
dependencies {
dependency "org.apache.commons:commons-lang3:3.8.1"
}
}
}
dependencies {
hoge "org.apache.commons:commons-lang3"
fuga "org.apache.commons:commons-lang3"
piyo "org.apache.commons:commons-lang3"
}
> gradle dependencies --configuration hoge
...
hoge
\--- org.apache.commons:commons-lang3 -> 3.8
> gradle dependencies --configuration fuga
...
fuga
\--- org.apache.commons:commons-lang3 -> 3.8.1
> gradle dependencies --configuration piyo
...
piyo
\--- org.apache.commons:commons-lang3 -> 3.9
解释
dependencyManagement {
dependencies {
dependencies {
dependency "org.apache.commons:commons-lang3:3.9"
}
}
hoge {
dependencies {
dependency "org.apache.commons:commons-lang3:3.8"
}
}
fuga {
dependencies {
dependency "org.apache.commons:commons-lang3:3.8.1"
}
}
}
dependencyManagement の直下に configuration 名でスクリプトブロックを挟むことで、 configuration ごとに依存バージョンを宣言できる
BOM のインポートも configuration ごとに可能
查看依存关系的版本
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
dependency "org.apache.commons:commons-pool2:2.6.0"
}
testImplementation {
dependencies {
dependency "org.apache.commons:commons-lang3:3.9"
dependency "org.apache.commons:commons-pool2:2.6.1"
}
}
}
task showManagedVersions {
doFirst {
println """\
|[default]
| commons-lang3 = ${dependencyManagement.managedVersions['org.apache.commons:commons-lang3']}
| commons-pool2 = ${dependencyManagement.managedVersions['org.apache.commons:commons-pool2']}
|
|[testImplementation]
| commons-lang3 = ${dependencyManagement.testImplementation.managedVersions['org.apache.commons:commons-lang3']}
| commons-pool2 = ${dependencyManagement.testImplementation.managedVersions['org.apache.commons:commons-pool2']}
|""".stripMargin()
}
}
> gradle showManagedVersions
...
[default]
commons-lang3 = 3.8.1
commons-pool2 = 2.6.0
[testImplementation]
commons-lang3 = 3.9
commons-pool2 = 2.6.1
解释
doFirst {
println """\
|[default]
| commons-lang3 = ${dependencyManagement.managedVersions['org.apache.commons:commons-lang3']}
| commons-pool2 = ${dependencyManagement.managedVersions['org.apache.commons:commons-pool2']}
|
|[testImplementation]
| commons-lang3 = ${dependencyManagement.testImplementation.managedVersions['org.apache.commons:commons-lang3']}
| commons-pool2 = ${dependencyManagement.testImplementation.managedVersions['org.apache.commons:commons-pool2']}
|""".stripMargin()
}
dependencyManagement.managedVersions から、最終的に解決された依存関係のバージョンを参照できる
dependencyManagement..managedVersions とすれば、 configuration ごとの情報も参照できる
使用多个项目时需要注意的事项。
在多项目中,虽然有几种方法可以覆盖声明的依赖版本,但直接指定依赖关系可能并不推荐使用。
發生問題的例子
假设我们正在创建一个具有以下结构的Spring Boot应用程序。
|-build.gradle
|-settings.gradle
|
|-common/
| |-src/main/java/
| | `-sample/common/
| | `-CommonComponent.java
| `-build.gradle
|
`-boot/
|-src/main/java/
| `-sample/
| `-SampleBootApplication.java
`-build.gradle
common は複数のプロジェクトから参照されるイメージ(ここでは説明を簡単にするため boot プロジェクトだけから参照されている)
boot は、 Spring Boot のプロジェクト
package sample.common;
import org.springframework.stereotype.Component;
import org.apache.commons.lang3.ObjectUtils;
@Component
public class CommonComponent {
public void method(Object obj) {
System.out.println(ObjectUtils.isEmpty(obj));
}
}
commons-lang3 の ObjectUtils.isEmpty() を使って、受け取ったオブジェクトが空かどうかを出力している
package sample;
import sample.common.CommonComponent;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SampleBootApplication {
public static void main(String[] args) {
try (ConfigurableApplicationContext context = SpringApplication.run(SampleBootApplication.class, args)) {
CommonComponent common = context.getBean(CommonComponent.class);
common.method("Hello World");
}
}
}
-
- こちらは Spring Boot を起動させるクラス
- 先程の CommonComponent を取り出して実行している
假设这个多项目的每个 build.gradle 文件被描述如下。
plugins {
id "org.springframework.boot" version "2.1.6.RELEASE" apply false
id "io.spring.dependency-management" version "1.0.8.RELEASE" apply false
}
subprojects {
apply plugin: "java"
apply plugin: "io.spring.dependency-management"
repositories {
mavenCentral()
}
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
}
}
sourceCompatibility = 11
targetCompatibility = 11
compileJava.options.encoding = "UTF-8"
}
-
- 各プロジェクトで共通な設定を subprojects でまとめている
- Dependency Management Plugin を使って、 Spring Boot の BOM を読み込んでいる
dependencies {
implementation "org.springframework:spring-context"
implementation "org.apache.commons:commons-lang3:3.9"
}
@Component を使うので、 spring-context の依存を宣言している
また、 ObjectUtils を使うので commons-lang3 の依存を宣言している
ここで、 commons-lang3 のバージョンには 3.9 を直接指定している
apply plugin: "org.springframework.boot"
dependencies {
implementation project(":common")
implementation "org.springframework.boot:spring-boot-starter"
}
-
- Spring Boot アプリになるので、 spring-boot-starter を依存関係に指定している
common プロジェクトを参照するので、こちらも依存関係に指定している
使用这个设置启动应用程序后,会变成以下这样。
> gradle bootRun
...
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.6.RELEASE)
...
2019-07-06 20:06:16.365 INFO 16428 --- [ main] sample.SampleBootApplication : Started SampleBootApplication in 0.846 seconds (JVM running for 1.335)
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.lang3.ObjectUtils.isEmpty(Ljava/lang/Object;)Z
at sample.common.CommonComponent.method(CommonComponent.java:10)
at sample.SampleBootApplication.main(SampleBootApplication.java:14)
> Task :boot:bootRun FAILED
FAILURE: Build failed with an exception.
NoSuchMethodError で落ちた
发生了什么事?
当打印出各个项目之间的依赖关系时,就能够知道发生了什么。
# common プロジェクトの依存関係
> gradle :common:dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.springframework:spring-context -> 5.1.8.RELEASE
| ...
\--- org.apache.commons:commons-lang3:3.9
# boot プロジェクトの依存関係
> gradle :boot:dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- project :common
| +--- org.springframework:spring-context -> 5.1.8.RELEASE
| | ...
| \--- org.apache.commons:commons-lang3:3.9 -> 3.8.1
\--- org.springframework.boot:spring-boot-starter -> 2.1.6.RELEASE
...
-
- よく見ると、 common プロジェクトの commons-lang3 は 3.9 になっているが、 boot プロジェクトから見たときは 3.8.1 になっている
-
- ちなみに、問題の起こった ObjectUtils.isEmpty() は 3.9 で新規追加されたメソッドになる
common プロジェクトがコンパイルされるときは 3.9 を参照しているので問題なくコンパイルはできる
しかし、 Spring Boot として起動するときは boot プロジェクトの runtimeClasspath が使用される
この結果、起動時に利用される commons-lang3 は 3.8.1 になり、当該メソッドがなくて実行時エラーになっていた
为什么版本不同?
dependencies {
implementation "org.springframework:spring-context"
implementation "org.apache.commons:commons-lang3:3.9"
}
common プロジェクトは、 commons-lang3 のバージョンを直接指定しているので 3.9 になる
apply plugin: "org.springframework.boot"
dependencies {
implementation project(":common")
implementation "org.springframework.boot:spring-boot-starter"
}
-
- 一方で、 boot プロジェクトは特に commons-lang3 のバージョンを指定していない
- したがって、 Spring Boot の BOM で定義されている 3.8.1 が採用されることになる
修改的方式
plugins {
id "org.springframework.boot" version "2.1.6.RELEASE" apply false
id "io.spring.dependency-management" version "1.0.8.RELEASE" apply false
}
subprojects {
apply plugin: "java"
apply plugin: "io.spring.dependency-management"
repositories {
mavenCentral()
}
dependencyManagement {
dependencies {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE"
}
dependency "org.apache.commons:commons-lang3:3.9"
}
}
...
}
dependencyManagement の中で commons-lang3 のバージョンを指定するように変更
これは subprojects 内での設定なので、 common と boot の両プロジェクトに適用される
dependencies {
implementation "org.springframework:spring-context"
implementation "org.apache.commons:commons-lang3"
}
common の build.gradle では、バージョンの指定をやめるように変更
# common の依存関係
> gradle :common:dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.springframework:spring-context -> 5.1.8.RELEASE
| ...
\--- org.apache.commons:commons-lang3 -> 3.9
# boot の依存関係
> gradle :boot:dependencies --configuration runtimeClasspath
...
runtimeClasspath - Runtime classpath of source set 'main'.
+--- project :common
| ...
| \--- org.apache.commons:commons-lang3 -> 3.9
\--- org.springframework.boot:spring-boot-starter -> 2.1.6.RELEASE
...
boot から見た場合も 3.9 になった
> gradle bootRun
...
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.6.RELEASE)
...
false
- 当然、実行してもエラーにはならない
请阅读以下内容
-
- spring-gradle-plugins/dependency-management-plugin: A Gradle plugin that provides Maven-like dependency management functionality
- Dependency Management Plugin