關鍵詞:spring-boot 依賴管理、spring-boot-dependencies、spring-boot-parentjava
maven 工程,依賴管理是很是基本又很是重要的功能,如今的工程愈來愈龐大,依賴愈來愈多,各類二方包、三方包太多太多,依賴衝突處理起來真是讓人頭疼,常常須要涉及到多個地方須要調整。mysql
微信公衆號:逸飛兮(專一於java知識領域的源碼分析,從源碼中理解框架/工具原理、驗證CS專業知識)spring
使用統一的依賴管理模塊來管理工程中的全部依賴。sql
spring-boot 工程常使用 spring-boot-dependencies、spring-boot-starter-parent 管理工程依賴。springboot
spring-boot 的最上級工程是 spring-boot-build,如下開始一步一步深刻了解 spring-boot 依賴解決方案。微信
spring-boot 的最上層工程,指定了 maven profiles、maven repositories、maven pluginRepositories、maven build pluginManagement。mybatis
dependencies 的父工程是spring-boot-build,不包含代碼,只用 pom 來管理依賴,pom.xml 以下:app
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-build</artifactId> <version>${revision}</version> <relativePath>../..</relativePath> </parent> <artifactId>spring-boot-dependencies</artifactId> <packaging>pom</packaging> <dependencyManagement> <!-- 省略具體依賴管理 --> </dependencyManagement> <build> <pluginManagement> <!-- 省略具體構建插件管理 --> </pluginManagement> <plugins> <!-- 省略具體構建插件 --> </plugins> </build>
從 pom 中能夠看出,spring-boot-dependencies 中除了引入了(3 個)插件,更多的是作版本的管理。框架
其中,引入的插件是:eclipse
dependencyManagement 中差很少管理了 spring-boot 工程中全部的依賴。
pluginManagement 中管理了經常使用的各類 maven 插件,這裏就不詳述了。
其中包含了 maven-clean-plugin、maven-compiler-plugin、maven-assembly-plugin、maven-war-plugin、maven-jar-plugin、spring-boot-maven-plugin,其中 spring-boot-maven-plugin 插件對於 spring-boot 工程很是重要,會把 maven 打包成的 jar 從新打包成可執行 jar。
既然有了 spring-boot-dependencies 這麼豐富的依賴、插件版本管理,那麼還搞一個 spring-boot-starter-parent 呢?
spring-boot-starter-parent 的父工程是spring-boot-dependencies,不包含代碼,只用 pom 來管理依賴,pom.xml 以下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${revision}</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent> <artifactId>spring-boot-starter-parent</artifactId> <packaging>pom</packaging> <name>Spring Boot Starter Parent</name> <description>Parent pom providing dependency and plugin management for applications built with Maven</description> <properties> <main.basedir>${basedir}/../../..</main.basedir> <java.version>1.8</java.version> <!-- 資源分隔符 --> <resource.delimiter>@</resource.delimiter> <!-- delimiter that doesn't clash with Spring ${} placeholders --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> </properties> <build> <resources> <resource> <directory>${basedir}/src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/application*.yml</include> <include>**/application*.yaml</include> <include>**/application*.properties</include> </includes> </resource> <resource> <directory>${basedir}/src/main/resources</directory> <excludes> <exclude>**/application*.yml</exclude> <exclude>**/application*.yaml</exclude> <exclude>**/application*.properties</exclude> </excludes> </resource> </resources> <pluginManagement> <plugins> <!-- 省略其它不用太關心的 plugin --> <!-- spring-boot 提供的 maven 重打包插件,重要!!! --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>${start-class}</mainClass> </configuration> </plugin> </plugins> </pluginManagement> <plugins> <!-- 引入公共插件:flatten-maven-plugin、xml-maven-plugin --> </plugins>
Note that, since theapplication.properties
andapplication.yml
files accept Spring style placeholders (${…}
), the Maven filtering is changed to use@..@
placeholders. (You can override that by setting a Maven property calledresource.delimiter
.)
譯:
注意,因爲 application.properties 和 application.yml 文件接受 spring 樣式的佔位符($…),因此 maven filter 將更改成使用@…@佔位符。(能夠經過設置名爲 resource.delimiter 的 maven 屬性來覆蓋該屬性。)
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${revision}</version> <relativePath>../spring-boot-dependencies</relativePath> </parent> <artifactId>spring-boot-parent</artifactId> <packaging>pom</packaging> <dependencyManagement> <!-- 省略具體依賴管理 --> </dependencyManagement> <dependencies> <!-- 省略具體依賴 --> </dependencies> <build> <pluginManagement> <!-- 省略具體構建插件管理 --> </pluginManagement> <plugins> <!-- 省略具體構建插件 --> </plugins> <profiles> <!-- 省略具體 profile --> </profiles> </build>
包含兩個部分:
所以,這裏所加入的依賴管理,用戶不須要關心,很好,省心。
公共的依賴,主要是一些測試依賴,如:junit、hamcrest、mockito、spring-test,還有斷言依賴:assertj。
添加了 spring-boot 公用的一些插件,如:maven-compiler-plugin、maven-jar-plugin、maven-war-plugin、maven-source-plugin 等
用戶基本不用關心。省略
spring-boot-dependencies 和 spring-boot-starter-parent、 spring-boot-parent 都提供了依賴管理的功能,那咱們在開發的過程當中,到底使用哪一個呢?
使用 spring-boot-dependencies,相比較 spring-boot-starter-parent 的時候特別注意要加上spring-boot-maven-plugin,以下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${springboot.version}</version> </plugin> </plugins> </pluginManagement> </build>
至於 spring-boot-starter-parent 的其餘額外指定的 jar,按需添加。
在工程中使用的時候,全部的二方、三方 jar 都應該統一管理,除了 spring-boot 提供的依賴,咱們還有不少 jar 須要管理,如:mysql 驅動包、mybatis 包、各類工具包或者公司內的二方包等。所以,最好使用一個單獨的模塊來構建本身的 dependencies 或 parent。
em……寫到這裏就結束了嗎?彷佛尚未,還須要細緻分析下一些具體依賴是如何選擇的,好比:spring-boot 選擇的是什麼日誌框架,logback?log4j2?log4j?那對於代碼中不是用 spring-boot 指定的日誌實現時,spring-boot 又是怎麼作的呢?期待後續更新?更或者不更新,誰知道呢?
公衆號:逸飛兮(專一於java知識領域的源碼分析,從源碼中理解框架/工具原理、驗證CS專業知識的應用)