使用Maven Archetype創建Java項目模板
1.over view
簡而言之,Archetype是一個Maven項目模板工具包。原型被定義為一種原始的模式或模型,所有其他同類的東西都是從中產生的。當我們試圖提供一個提供生成Maven項目的一致方法的系統時,這個名字就合適了。Archetype將幫助作者為用戶創建Maven項目模板,並為用戶提供生成這些項目模板的參數化版本的方法。
使用原型提供了一種很好的方法,可以與您的項目或組織所採用的最佳實踐一致的方式快速地使開發人員受益。您可能希望在組織內部實現J2EE開發的標準化,因此您可能希望提供EJB,WAR或Web服務的原型。一旦創建了這些原型並將其部署在組織的存儲庫中,組織中的所有開發人員就可以使用它們。
2.do it
⚠️:我們將使用springboot項目來演示如何生成一個maven archetype(原型),本文中(模板)(原型)交替使用,二者意思相同。
示例,我們有一個現成的項目,其結構如下:
.
├── Dockerfile
├── README.md
├── last-demo.iml
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
├── main
│ ├── java
│ │ └── com
│ │ └── demo
│ │ └── data
│ │ ├── Application.java
│ │ └── your_business_package
│ │ ├── client
│ │ │ └── DemoClient.java
│ │ ├── constants
│ │ │ └── YourBusinessConstants.java
│ │ ├── enumerate
│ │ │ └── DemoStatus.java
│ │ ├── presistence
│ │ │ ├── DemoRepository.java
│ │ │ └── entity
│ │ │ └── DemoDO.java
│ │ ├── service
│ │ │ └── DemoService.java
│ │ └── web
│ │ ├── dto
│ │ │ └── DemoDTO.java
│ │ └── rest
│ │ └── DemoController.java
│ └── resources
│ ├── application.yml
│ └── logback-spring.xml
└── test
├── java
│ └── com
│ └── demo
│ └── data
│ └── ApplicationTests.java
└── resources
└── application.yml
我們將使用maven archetype來創建以該項目為基礎的模板。
2.1 生成模板文件夾
執行以下maven命令:
mvn archetype:create-from-project
此時項目中會生成target/generated-sources/archetype文件夾,其中存放的就是我們的模板相關文件。
2.2 自定義模板
探索target/generated-sources/archetype我們可以得知:
generated-sources
└── archetype
├── pom.xml
├── src
│ ├── main
│ │ └── resources
│ │ ├── META-INF
│ │ │ └── maven
│ │ │ └── archetype-metadata.xml ##⚠️原型描述符,描述了我們原型的結構
│ │ └── archetype-resources ##⚠️經過maven轉換後的項目文件包
│ └── test
│ └── resources
│ └── projects
│ └── basic
└── target
├── classes
│ └── archetype-resources
├── your_project_name.jar
└── test-classes
└── projects
└── basic
我們隨機打開一個archetype-resources中的源文件,可以看到如下:
上圖中我們看到的${package}佔位符,這個就是maven原型插件自動處理的結果,到時候我們根據原型生成項目的時候,這些佔位符就會變成我們新生成項目的相關的值。類似,maven還提供了groupId,artifactId, version等關鍵字。如果我們項目中有其他地方也需要這種定製化,我們可以手動進行更改。
例如我們把項目配置文件改為如下(應用名用佔位符代替),目的是實現項目的名稱隨新建的項目變動。
接下來來分析archetype-metadata.xml,他是原型描述符號,我們可以指定那些文件進入原型里,那些文件需要排除,還能指定上面說的佔位符需不需要被替換 等等。
如下為archetype-metadata.xml示例:
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor xsi:schemaLocation="//maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0">
<fileSets>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
</fileSet>
<!--下面還有更多項-->
⚠️:fileSet屬性標籤指定的那些文件需要納入原型中,我們把不需要的刪掉。
⚠️:filtered屬性標籤表示是否替換文件中的佔位符,若為true則會替換,否則不會,所以我們如果想要佔位符最後會被替換為項目相關的信息,還需要通過這個標籤指定。
⚠️:packaged屬性標籤指定文件是否在項目的包裏面,true或false。
2.3 生成模板(原型)
我們進入target/generated-sources/archetype目錄,執行以下命令:
mvn install
此時模板將在我們本地生成。
2.4 使用模板(原型)生成新項目
我們使用以下命令:
mvn archetype:generate \ -DarchetypeCatalog=local \ -DgroupId=新建項目的groupId \ -DartifactId=新建項目的artifactId \ -DarchetypeGroupId=你的原型group \ -DarchetypeArtifactId=你的原型項目名字-archetype \ -DarchetypeVersion=你的原型版本 \ -DinteractiveMode=false
之後,我們會生成新項目。項目的結構符合我們的原型結構。查看我們手動指定的application.yml
可以看到我們的佔位符被我們項目的相關信息給替換了。
2.5 將模板上傳至maven倉庫
我們進入target/generated-sources/archetype目錄,打開pom.xml
添加倉庫信息:
<distributionManagement>
<repository>
<id>my-releases</id>
<url>你的倉庫地址</url>
</repository>
<snapshotRepository>
<id>my-snapshots</id>
<url>你的倉庫地址</url>
</snapshotRepository>
</distributionManagement>
<servers>
<server>
<id>my-snapshots</id>
<username>對應倉庫的username</username>
<password>對應倉庫的password</password>
</server>
<server>
<id>my-releases</id>
<username>對應倉庫的username</username>
<password>對應倉庫的password</password>
</server>
</servers>
隨後指定如下命令:
mvn deploy
隨後,原型將被上傳至你的mavne倉庫。
3.summary
本文我們介紹的maven的原型及其特性帶來的好處,並且我們演示了如何生成一個原型,並且利用原型來創建一個新項目。
關注筆者公眾號,推送各類原創/優質技術文章 ⬇️