1. 程式人生 > >maven父子模組jar包管理和spring boot

maven父子模組jar包管理和spring boot

注:
如果父pom中使用的是
<dependencies>....</dependencies>
的方式,則子pom會自動使用pom中的jar包,
如果父pom使用

<dependencyManagement>
    <dependencies>....</dependencies>
</dependencyManagement>

方式,則子pom不會自動使用父pom中的jar包,這時如果子pom想使用的話,就要給出groupId和artifactId,無需給出version

專案結構:

parent--父模組空maven專案, 用於管理子模組
    controller
    service
    dao
    model
    client--被其他專案依賴進行微服務內部呼叫(因下面問題導致client在其他專案中版本衝突和引入大量無用的jar包)    

存在問題:

  1. 父模組繼承spring boot和引入大量jar包, 當專案1引入專案2中的client模組時導致專案2中父模組中很多無用的jar包也引入到專案1中
  2. 開始計劃是父模組放公用的包和管理子模組的版本, 最後每個人的習慣不一樣導致不同專案之間的版本衝突
  3. spring boot繼承在maven父子模組中很容易版本衝突

解決方法:

  1. 哪個模組用到什麼引入什麼, 保持子模組獨立
  2. 父模組只放標籤管理版本, 不引入任何jar包
  3. 父模組不繼承spring boot, 由controller層匯入spring boot

由父模組繼承spring boot改為子模組匯入spring boot

<!-- 父模組不要這樣使用繼承 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 使用dependencyManagement匯入版本號 -->
<dependencyManagement>
    <dependencies>
        <!-- 
            自定義版本覆蓋spring boot內的版本;
            比如驗證框架6.0.10.Final覆蓋spring boot parent內的5.3.6.Final;
            專案會優先獲取spring boot內版本, 覆蓋可以避免版本衝突
            注意: 覆蓋版本一定要在spring-boot-dependencies上面
        -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.10.Final</version>
        </dependency>

        <!-- 匯入spring boot的pom -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.13.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

.....

<!-- 使用匯入, 一定要使用spring-boot-maven外掛, 否則無法使用java -jar 命令 -->
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.5.13.RELEASE</version>
    <configuration>
        <mainClass>${start-class}</mainClass>
        <layout>ZIP</layout>
        <!--<skip>true</skip>-->
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>