spring-boot-starter-parent,Spring Boot应用的父级依赖;
一.简介:
提供了springboot统一的依赖管理和插件管理;
主要的依赖其实是继承了spring-boot-dependencies(通过标签dependencyManagement管理依赖声明),本质是继承了它然后扩展了插件配置;
spring-boot-starter-parent具体作用:
1.引入父pom里面的依赖时无须指定版本;
2.java版本,项目编码格式,资源引用描述符已经设置好
3.插件管理
a.封装了配置文件的过滤规则
b.封装了打可执行jar、war的配置
c.封装了插件的版本信息
d.封装了日期格式
e.引入了eclipse和IDEA相关依赖简化了配置,达到开箱即用等
。。。
这些从pom里面可以看到:(2.0.6)
4.0.0
org.springframework.boot
spring-boot-dependencies
2.0.6.RELEASE
../../spring-boot-dependencies
spring-boot-starter-parent
pom
-- java版本,项目编码格式,资源引用描述符
UTF-8
1.8
@
${java.version}
UTF-8
${java.version}
--插件管理
1.封装了配置文件的过滤规则
2.封装了打可执行jar、war的配置
3.封装了插件的版本信息
4.引入了eclipse和IDEA相关依赖简化了配置,达到开箱即用等
true
${basedir}/src/main/resources
**/application*.yml
**/application*.yaml
**/application*.properties
${basedir}/src/main/resources
**/application*.yml
**/application*.yaml
**/application*.properties
org.jetbrains.kotlin
kotlin-maven-plugin
${kotlin.version}
compile
compile
compile
test-compile
test-compile
test-compile
${java.version}
true
maven-compiler-plugin
true
maven-failsafe-plugin
integration-test
verify
${project.build.outputDirectory}
maven-jar-plugin
${start-class}
true
maven-war-plugin
${start-class}
true
org.codehaus.mojo
exec-maven-plugin
${start-class}
maven-resources-plugin
${resource.delimiter}
false
pl.project13.maven
git-commit-id-plugin
revision
true
yyyy-MM-dd'T'HH:mm:ssZ
true
${project.build.outputDirectory}/git.properties
org.springframework.boot
spring-boot-maven-plugin
repackage
${start-class}
maven-shade-plugin
package
shade
META-INF/spring.handlers
META-INF/spring.factories
META-INF/spring.schemas
${start-class}
org.springframework.boot
spring-boot-maven-plugin
2.0.6.RELEASE
true
true
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
org.eclipse.m2e
lifecycle-mapping
1.0.0
org.codehaus.mojo
flatten-maven-plugin
[1.0.0,)
flatten
org.apache.maven.plugins
maven-checkstyle-plugin
[3.0.0,)
check
二.怎么体现上面的特点? 失去他你才懂得。。。
那么这里分2种情况:
2.1:不继承spring-boot-starter-parent,所有的依赖自已写;
4.0.0
com.ysy
spring-boot-01
1.0-SNAPSHOT
war
org.springframework.boot
spring-boot-starter-web
2.0.6.RELEASE
org.springframework.boot
spring-boot-maven-plugin
2.0.6.RELEASE
虽然你本地可以正常起来跑起来;(依赖都有,当然可以跑起来)
但是打包会报错;使用mvn clean package指令或者Idea操作;
情况1.打war
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project spring-boot-01: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]
[ERROR]
在上面的pom中,我并没有引入maven-war-plugin依赖;那它怎么来的呢?
看执行日志:
[INFO] -----------------------< com.ysy:spring-boot-01 >-----------------------
[INFO] Building spring-boot-01 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
Downloading from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/2.2/maven-war-plugin-2.2.pom
Downloaded from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/2.2/maven-war-plugin-2.2.pom (6.5 kB at 1.7 kB/s)
Downloading from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/2.2/maven-war-plugin-2.2.jar
Downloaded from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/maven-war-plugin/2.2/maven-war-plugin-2.2.jar (79 kB at 53 kB/s)
[INFO]
它会自动从远程仓库下载默认依赖;
默认的war版本2.2是必须要求web应用存在web.xml的,于是报错;
在2.0.6的spring-boot-dependencies中可以知道;里面的maven-war-plugin是3.1.0;
spring-boot-maven-plugin是2.0.6;如下
3.1.0
org.springframework.boot
spring-boot-maven-plugin
2.0.6.RELEASE
为了解决上面的报错;
那我在pom里面指定maven-war-plugin版本吧;
org.apache.maven.plugins
maven-war-plugin
3.1.0
org.springframework.boot
spring-boot-maven-plugin
2.0.6.RELEASE
然后再执行,嗯,打包成功了;
开始跑跑:
可以看到,启动失败了,没有找到启动类;
原来:还需要对spring-boot-maven-plugin配置一下:
org.springframework.boot
spring-boot-maven-plugin
2.0.6.RELEASE
repackage
再次打包成功启动;
而这些配置,在spring-boot-starter-parent里面全部都帮你配好了,让你远离这些坑。。
情况2.打jar,同理,也需要配置repackage才能变成可执行jar
org.springframework.boot
spring-boot-maven-plugin
2.0.6.RELEASE
repackage
2.2:不继承spring-boot-starter-parent,但是继承spring-boot-dependencies
这个操作看似可以的,但是你只是继承了spring-boot-dependencies的依赖声明,但是插件管理还是需要你自已写的,如你打包时还是需要在pom声明repackage才能运行的;
而spring-boot-starter-parent已经帮你写好了插件管理及其他功能;
所以你要自已考虑清楚,自已是否需要扩展重新写自已的parent;
其中,如果你只想使用spring-boot-dependencies的依赖,可以用
dependencyManagement引入如下; 也可以你自已写重写一套依赖;
org.springframework.boot
spring-boot-dependencies
2.2.4.RELEASE
pom
import
补充知识:父pom在被继承的时候,
dependencies与dependencyManagement的区别
1.dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承) ,管理的是具体的依赖关系;
2.dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
,管理的是依赖的声明;