Maven Archetype 多 Module 自定義程式碼腳手架

艾小仙 發表於 2022-01-14

大部分公司都會有一個通用的模板專案,幫助你快速建立一個專案。通常,這個專案需要整合一些公司內部的中介軟體、單元測試、標準的程式碼格式、通用的程式碼分層等等。

今天,就利用 Maven 的 Archetype 外掛來簡單實現這一功能。

Maven Archetype 多 Module 自定義程式碼腳手架

通過上面的圖很清楚可以看到,實際利用這個外掛機制就簡單的幾個步驟:

  1. archetype:create-from-project ,根據自己的專案程式碼生成原型專案
  2. 通過 install 等命令生成原型檔案
  3. archetype:generate,通過原型生成目標專案

看起來挺簡單的,但是你會發現你用網上搜到的資料來玩的話,你生成的專案特別傻X,包括官方的文件,我也真是沒搞明白他們為何那麼牛逼,一步兩步。。就他媽好了?

一堆問題,比如 module 名稱不會變、包名變了程式碼中沒變,依賴報錯一大堆問題,還是有必要說下中間要怎麼做的。

建立Archetype

首先,準備好我們自己的模板專案,保證程式碼都是OK的。

進入專案根目錄,執行命令:

mvn archetype:create-from-project

然後專案根目錄下會生成target資料夾,這個很簡單,不會有任何障礙,你看下面的圖,注意看每個模組的名字,這是我改過的!!

你生成應該會發現他不長這樣,這就是問題啊!接著往下看吧。

Maven Archetype 多 Module 自定義程式碼腳手架

這裡最核心的部分就在於怎麼修改target/generated-sources/src/main/resources/archetype-resources下的檔案。

如果不修改直接繼續的話,最終生成的專案會發現module的名稱不會變,包名也不會變,程式碼裡引用的會有一堆報錯。

接著,我們看看咋改的,這一堆破問題。

修改父pom

首先,找到根目錄的pom檔案,會發現缺少module資訊,這個必須加上。

 <modules>
  <module>${rootArtifactId}-client</module>
  <module>${rootArtifactId}-common</module>
  <module>${rootArtifactId}-service</module>
  <module>${rootArtifactId}-facade</module>
  <module>${rootArtifactId}-starter</module>
 </modules>
 

父pom依賴引用的每個module也要修改,groupId 和 artifactId 按照我給出的方式來改,不要寫死!!

<dependencyManagement>
  <dependencies>
   <dependency>
    <groupId>${groupId}</groupId>
    <artifactId>${rootArtifactId}-client</artifactId>
    <version>${project.version}</version>
   </dependency>
   ... ...
  </dependencies>
 </dependencyManagement>

修改module

這個就是圖中的問題,預設生成的module可能就是模板專案的名字,需要修改成類似__rootArtifactId__-client這種形式,注意是雙下劃線。

然後module中的互相引用 groupId 和 artifactId 按照父 pom 的方式對應修改。

archetype-metadata 修改

找到META-INF/maven/archetype-metadata.xml檔案,修改modules相關的部分,重點注意看 id 、dir、name 的修改方式。

<modules>
    <module id="${rootArtifactId}-client" dir="__rootArtifactId__-client" name="${rootArtifactId}-client">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
      </fileSets>
    </module>
    ... ...
</modules>   

修改完成之後,進入 target/generated-sources/archetype目錄,執行命令:

mvn install

順便執行下mvn deploy上傳到nexus。

使用Archetype

經過上面的步驟,原型 Archetype 已經建立完成,其實最大的坑也就是上面那部分,花了老半天時間,簡直坑爹啊。

下面看看怎麼使用吧,兩種使用方式。

命令列

隨便進入你想儲存專案的路徑,執行命令。

mvn archetype:generate -DarchetypeCatalog=local

依次按照提示輸入 groupId、artifactId 即可完成建立。

那怎麼給其他人使用?

你的本地maven倉庫目錄(比如~/.m2/repository)有一個檔案archetype-catalog.xml,共享給其他人就行了。

<?xml version="1.0" encoding="UTF-8"?>
<archetype-catalog xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0 http://maven.apache.org/xsd/archetype-catalog-1.0.0.xsd"
    xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <archetypes>
    <archetype>
      <groupId>com.example</groupId>
      <artifactId>template-archetype</artifactId>
      <version>1.0.0-SNAPSHOT</version>
      <description>Example Project</description>
    </archetype>
  </archetypes>
</archetype-catalog>
 

IDEA

新建專案,選擇 Maven,勾選 Create from archetype,選擇 Add Archetype...

Maven Archetype 多 Module 自定義程式碼腳手架

接著,輸入我們自定義的 Archetype 的 GroupId、ArtifactId、Version 資訊。

Add 成功之後就可以在列表中看到我們自己的 archetype,然後按照流程建立即可。