文章目錄
- 1.問題思考(如何對集成模塊進行打包)
- 2.問題解決 (如何對集成模塊進行打包)
- 3.使用者使用該jar包(jar包安裝本地倉庫和使用)
1.問題思考(如何對集成模塊進行打包)
思考:假設有這么一個場景,你需要制作一個Springboot的集成模塊 給其他人使用,該集成模塊依賴了你公司的多個內部的模塊,并且該集成模塊是沒有主啟動類之類的。當你把集成模塊開發完畢之后,如何提供給在其他外部環境使用?
??如果你沒有做其他任何打包配置,直接對集成模塊進行maven install,你會發現你打出來的jar包很小,例如只有十幾KB,此顯然是有問題的,該jar包集成模塊所依賴的外部模塊、內部模塊 都沒有集成進jar包里面,所以會導致jar包很小。
??此時如果將該jar包安裝到本地倉庫并進行使用,會發現在使用的過程中,該集成模塊缺少其所需依賴的內部模塊,而這些內部模塊是使用者所不曾擁有的。
使用spring-boot-maven-plugin 來實現依賴集成打包,行不行?
答:不行的,因為使用spring-boot-maven-plugin插件進行打包,會要求該模塊必須要有一個主啟動類,否則會打包失敗。我們的集成模塊是沒有主啟動類的,故而使用該方式會打包失敗!
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.1.3</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
2.問題解決 (如何對集成模塊進行打包)
在需要打包的集成模塊的pom.xml里面進行如下配置:
<!-- 將本模塊所需依賴到打進本jar包(此方式無需主啟動類) -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.4.1</version> <!-- 使用最新版本 --><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><!-- 防止某些文件被重復打包,比如 META-INF 下的文件 --><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass><!-- 這里通常不需要指定,因為沒有主啟動類 --></mainClass></transformer><!-- 如果需要合并某些文件,比如 Spring 的配置文件,可以使用 AppendingTransformer 等 --></transformers></configuration></execution></executions>
</plugin>
然后進行maven install打包,會發現沒用Main主入口也能打包成功,并且打出來的jar包也是包含了所需的相關依賴,這里是20MB.
3.使用者使用該jar包(jar包安裝本地倉庫和使用)
你只需將上面打好的jar包發給其他人,其他人只需將jar包安裝到本地倉庫,然后在自身項目的pom.xml進行引用即可。
jar包安裝到本地倉庫的命令:
mvn install:install-file -Dfile=D:\aaa-1.0.0-SNAPSHOT.jar -DgroupId=com.bbb -DartifactId=aaa -Dversion=ccc-SNAPSHOT -Dpackaging=jar
上面參數說明:
-Dfile=D:\aaa-1.0.0-SNAPSHOT.jar:為jar包所在的磁盤完整路徑。
-DgroupId=com.bbb:為jar包所在的組織。
-DartifactId=aaa:當前依賴的名稱
-Dversion=ccc-SNAPSHOT:當前依賴的版本
這里的-DgroupId、-DartifactId、-Dversion的值可以隨便填,只需要和使用者pom.xml對應的依賴配置能一致即可。
使用者將jar包安裝到本地倉庫之后,在自身項目的pom.xml里面進行使用。
<dependency><groupId>com.bbb</groupId><artifactId>aaa</artifactId><version>ccc-SNAPSHOT</version>
</dependency>