Spring cloud的Maven插件(一):repackage目標


簡介

  Spring Boot Maven Plugin插件提供spring boot在maven中的支持。允許你打包可運行的jar包或war包。

  插件提供了幾個maven目標和Spring Boot 應用一起工作。總的有:

  repackage:創建一個自動可執行的jar或war文件。它可以替換常規的artifact,或者用一個單獨的classifier附屬在maven構建的生命周期中。

  下面我們詳細看下repackage這個目標。

一、簡單引用

   用了重新打包應用程序,我們需要在pom.xml文件中加一個簡單的引用到Spring Boot Maven Plugin插件中,代碼如下:repaceage 最簡單的結構

 1 <build>
 2   ...
 3   <plugins>
 4     ...
 5     <plugin>
 6       <groupId>org.springframework.boot</groupId>
 7       <artifactId>spring-boot-maven-plugin</artifactId>
 8       <version>1.5.7.RELEASE</version>
 9       <executions>
10         <execution>
11           <goals>
12             <goal>repackage</goal>
13           </goals>
14         </execution>
15       </executions>
16     </plugin>
17     ...
18   </plugins>
19   ...
20 </build>
repaceage 最簡單的結構

二、剔除不需要的依賴

  這個例子重新打包了一個jar包或war包,這個jar包或war包被構建於maven生命周期的package階段,包括定義在工程中的任何依賴(包括scope為provided)。如果有一些依賴模塊需要被排除掉,可以使用一個exclude的選項。

  默認情況下,repackage和run這兩個maven目標會包括定義在工程中的任何依賴。一些依賴被要求從可執行jar包中排除。下面有三種方式可以在包運行時排除依賴模塊。

  方式1::排除一個具體的maven 模塊,通過唯一的groupId和artifactId組合來實現。(如果有必要,可以加入classifier來唯一確認。)

 1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.6.RELEASE</version>
11         <configuration>
12           <excludes>
13             <exclude>
14               <groupId>com.foo</groupId>
15               <artifactId>bar</artifactId>
16             </exclude>
17           </excludes>
18         </configuration>
19         ...
20       </plugin>
21       ...
22     </plugins>
23     ...
24   </build>
25   ...
26 </project>
排除一個具體的maven模塊

  方式2:排除和“指定的artifactId”相符的所有maven模塊。

 1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.6.RELEASE</version>
11         <configuration>
12           <excludeArtifactIds>my-lib,another-lib</excludeArtifactIds>
13         </configuration>
14         ...
15       </plugin>
16       ...
17     </plugins>
18     ...
19   </build>
20   ...
21 </project>
排除和指定的artifactId項目的所有maven模塊

  方式3:排除屬於“指定的groupId”的所有maven模塊。

 1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.6.RELEASE</version>
11         <configuration>
12           <excludeGroupIds>com.foo</excludeGroupIds>
13         </configuration>
14         ...
15       </plugin>
16       ...
17     </plugins>
18     ...
19   </build>
20   ...
21 </project>
排除屬於指定的groupId的所有maven模塊

三、重寫manifest 

  這個插件還可以重寫項目的manifest (可運行jar包的MANIFEST.MF),特別是管理Main-Class和Start-Class啟動類。如果默認的配置不能滿足需求,我們可以在這里做配置。通過插件的layout屬性可以確實地控制Main-Class。

 1 <build>
 2   ...
 3   <plugins>
 4     ...
 5     <plugin>
 6       <groupId>org.springframework.boot</groupId>
 7       <artifactId>spring-boot-maven-plugin</artifactId>
 8       <version>1.5.7.RELEASE</version>
 9       <configuration>
10         <mainClass>${start-class}</mainClass>
11         <layout>ZIP</layout>
12       </configuration>
13       <executions>
14         <execution>
15           <goals>
16             <goal>repackage</goal>
17           </goals>
18         </execution>
19       </executions>
20     </plugin>
21     ...
22   </plugins>
23   ...
24 </build>
repackage mainClass

  執行打包命令:mvn package spring-boot:repackage。注意:這里不能寫成mvn spring-boot:repackage。否則會報Source must refer to an existing file異常。

  layout屬性默認根據archive type(jar or war)而定。總的有5中類型:

  • JAR:常規的可執行jar包的布局。
  • WAR:可執行war包的布局。
  • ZIP(和DIR一樣):和使用PropertiesLauncher的jar包布局一樣。
  • MODULE:包括依賴包(排除scope為provided的依賴包)和項目資源
  • NONE:包括所有的依賴包和項目資源。

四、利用classifier分離代碼包和依賴包

  當自己寫項目需要發布出去給別人依賴時,就只需要自己寫的代碼打包,依賴的包不能打進來。否則最后別人在用你提供的包時,就會出現重復包,導致最后打包時包會非常巨大。

  在這個Spring Boot Maven Plugin這個插件下,我們只需要提供classifier即可實現這個功能。具體如下:

 1 <project>
 2   ...
 3   <build>
 4     ...
 5     <plugins>
 6       ...
 7       <plugin>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-maven-plugin</artifactId>
10         <version>1.5.7.RELEASE</version>
11         <executions>
12           <execution>
13             <goals>
14               <goal>repackage</goal>
15             </goals>
16             <configuration>
17               <classifier>exec</classifier>
18             </configuration>
19           </execution>
20         </executions>
21         ...
22       </plugin>
23       ...
24     </plugins>
25     ...
26   </build>
27   ...
28 </project>
repackage classifier

五、打包時排除resources下的資源文件

 1 <build>
 2   ...
 3     <resources>
 4         <resource>
 5             <directory>src/main/resources</directory>
 6             <excludes>
 7                 <exclude>**/*.properties</exclude>
 8                 <exclude>**/*.xml</exclude>
 9                 <exclude>**/*.yml</exclude>
10             </excludes>
11         </resource>
12     </resources>
13     <plugins>
14       ...
15         <plugin>
16             <groupId>org.springframework.boot</groupId>
17             <artifactId>spring-boot-maven-plugin</artifactId>
18             <executions>
19                 <execution>
20                     <goals>
21                         <goal>repackage</goal>
22                     </goals>
23                 </execution>
24             </executions>
25         </plugin>
26       ...
27     </plugins>
28   ...
29 </build>
排除resources下的資源文件

   

喜歡請微信掃描下面二維碼,關注我公眾號--“精修Java”,做一些實戰項目中的問題和解決方案分享。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM