為什么需要統一的父pom
由于在項目中存在不同的模塊,而模塊間很可能引用一些共同的jar包,會很容易導致版本沖突。因此,需要一個統一的pom文件來作為父文件管理所有的依賴版本。
如何在Spring Boot中使用這樣的pom文件
將項目從邏輯上劃分為父項目和各模塊,然后在各自的pom文件中配置其管理關系。
Step1: 父項目中的pom配置
- 首先必然是需要建立一個父項目,同時在其pom文件中將打包方式修改為pom:
<package>pom</package>
。 - 添加spring boot的build方式。
<build>
<finalName>parentboot</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
spring-boot-maven-plugin和maven-compiler-plugin的區別
前者直接將spring-boot程序打成可執行的jar包了,拿出來就直接通過命令行啟動內置的tomcat,進而帶動應用的啟動。后者只是單純的打包。
- 將其依賴方式等,修改為<dependencyManagement>的方式,同時在里面添加所有的Spring Boot的總依賴
spring-boot-dependencies
。
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 如果想單獨升級某個模塊,而不依賴于
spring-boot-dependencies
的話,可以直接將該模塊的依賴寫在dependency之前,并且scope為import
,類型為pom
。
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Step2: 創建子模塊
- 直接使用spring的start建立一個子模塊即可。
- 刪除子模塊pom文件的相關配置,追加spring boot web依賴包。
注意
此時會出現junit沖突的報錯。因為Spring Boot在父項目中引入的依賴包是很全的,鎖定了程序中很多依賴的版本。此時直接從子項目中刪除其junit依賴即可。
Step3: 一些其他的注意點
- 使用start生成的spring boot子項目,其pom文件中的<parent>標簽需要修改為現在的父項目。這個不要忘了。
- 同樣的,不要忘記在父項目中,通過module標簽引入子模塊。