Maven構建分散式專案時子模組相互依賴打包技巧
阿新 • • 發佈:2021-06-17
場景
最近在學習使用Jenkins自動化部署分散式微服務的時候,需要將微服務打成Jar包傳送到伺服器製作成映象供Jenkins拉取執行,瞭解到 spring-boot-maven-plugin
外掛可以完成Maven工程的打包任務。
問題
直接在父pom檔案引入如下外掛將會導致Maven打的微服務Jar包不會將外部依賴匯入其中,且其他模組在依賴本模組的時候可能出現找不到類的報錯。即無法通過 java -jar xxx.jar
命令來啟動服務。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
原因
spring-boot-maven-plugin
打出來的Jar包預設是不可依賴的,需要進行一些額外的配置。
比如一個微服務工程中,往往會抽取出來一個 common
公共模組,在 common
公共模組中使用了 spring-boot-maven-plugin
的預設配置build,其他依賴了 common
模組的比如 provider
或者 order
在使用打包命令進行打包時就會出錯,錯誤是在 provider
或者 order
中找不到 common
中的類,原因就是此外掛預設預設打包出來的Jar是不可依賴的。
解決方案
在父工程pom檔案和公共模組pom檔案做一些修改
<!-- 父pom --> <build> <plugins> <!-- 資原始檔拷貝外掛 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- Java編譯外掛 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- maven打包外掛 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <!-- common pom --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- 這個屬性為可執行jar包的名字字尾 --> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build> <!-- 其餘子模組會繼承父模組 -->
配置完後在進行 mvn clean package
或者 mvn clean install
命令打包服務後,可用 java -jar xxx.jar
正常啟動。
其他細節
在使用 spring-boot-maven-plugin
外掛進行打包操作的時候強烈建議指明JDK版本,不然可能在使用了一些Java8新特性的時候可能受到類似不識別Lambda,請使用Resource8這樣的錯誤。
<properties> <java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>