溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何寫Maven的archetype項目腳手架

發(fā)布時間:2021-08-30 14:17:01 來源:億速云 閱讀:153 作者:小新 欄目:開發(fā)技術

這篇文章將為大家詳細講解有關如何寫Maven的archetype項目腳手架,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

    一、背景

      maven是一個很好的代碼構建工具,采用“約定優(yōu)先于配置”的原則進行項目管理,相信很多的java開發(fā)者應該都了解maven并可能在工作當中都是通過maven來管理項目的,在創(chuàng)建的項目的時候,我們往往會使用maven內(nèi)置的項目骨架也就是archetype來快速生成項目結構。但是在一個團隊做開發(fā)的過程中,可能僅僅依靠maven預先提供的archetyp可能是不夠的,團隊之間協(xié)作有自己的定義方式,每個人的結構定義風格也不盡相同,在這樣的背景下我們有必要去定義一個統(tǒng)一的代碼骨架供團隊使用,這樣做的好處是當團隊需要開始一個新項目的時候,可以利用自定義的maven骨架一鍵生成項目。

      archetype是在maven-archetype-plugin插件執(zhí)行generate目標的時候進行配置的,我們經(jīng)常使用到maven的內(nèi)嵌的骨架包括:maven-archetype-webapp、maven-archetype-quickstart。前者用來快速搭建一個web工程項目,后者用來快速搭建一個普通的java工程項目。

    二、手寫普通單模塊項目的archetype

    單模塊項目的archetype腳手架項目的結構

    如何寫Maven的archetype項目腳手架

    上圖中的各個文件詳解:

    • 根目錄beast-archetype下的pom.xml和一般的maven項目一樣主要定義archetype項目的坐標等信息。

    • 所有的項目骨架內(nèi)容都集中在src/main/resources/archetype-resources文件夾下。

    • archetype-resources中的pom.xml定義了待生成項目的pom文件的內(nèi)容,/src/main/java、/src/test/java中分別定義了待生成項目中相應目錄下的內(nèi)容

    • /src/main/resources/META-INF/maven/archetype-metadata.xml中定義相關的元數(shù)據(jù)描述(其中該文件的位置固定為resources/META-INF/maven文件夾下,且名稱固定為archetype-metadata.xml)。

    1.beast-archetype/pom.xml內(nèi)容如下

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.thebeastshop</groupId>
        <artifactId>beast-archetype</artifactId>
        <version>1.1</version>
        <packaging>jar</packaging>
    
        <name>beast-archetype</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <finalName>beast-archetype</finalName>
        </build>
    </project>

    2.src/main/resources/archetype-resources/pom.xml內(nèi)容如下:

    <?xml version="1.0"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>${groupId}</groupId>
        <artifactId>${artifactId}</artifactId>
        <version>${version}</version>
        <name>${artifactId}</name>
        
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                 <plugin> 
                     <artifactId>maven-deploy-plugin</artifactId> 
                     <configuration> 
                        <skip>true</skip> 
                     </configuration> 
                 </plugin>
            </plugins>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-archetype-plugin</artifactId>
                        <version>2.2</version>
                        <configuration>
                            <source>1.7</source>
                            <target>1.7</target>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <configuration>
                            <encoding>UTF-8</encoding>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>

    其中:上面${}標識的變量都是通過maven中的命令行傳進來的,如:mvn archetype:generate -DgroupId=com.thebeastshop

    3.src/main/resources/META-INF/maven/archetype-metadata.xml內(nèi)容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <archetype-descriptor  name="beast-archetype"
            xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="
                http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0
                http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd">
    
        <requiredProperties>
            <requiredProperty key="package-name" />
        </requiredProperties>
    
        <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>**/*.*</include>
                </includes>
            </fileSet>
            <fileSet filtered="true" packaged="true" encoding="UTF-8">
                <directory>src/test/java</directory>
                <includes>
                    <include>**/*.java</include>
                </includes>
            </fileSet>
            <fileSet encoding="UTF-8">
                <directory>src/test/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </fileSet>
        </fileSets>
    </archetype-descriptor>

    說明:

    • packaged="true"標識src/main/resources/archetype-resources/src/main/java中對應的內(nèi)容是否要放入到package中,比如package為com.thebeastshop,那么如果該屬性為true,則對應的java文件會放到com/thebeastshop文件夾下,也就是包路徑下。

    • filtered="true"標識下面提到的${}是否要進行替換

    4.src/main/resources/archetype-resources/src/main/java/Demo.java內(nèi)容如下:

    package ${package};
    
    public class Demo{
        public static void main( String[] args )
        {
            System.out.println( "Hello My Archetype!" );
        }
    }

    5.這樣我們就手寫好了一個自定義的maven的archetype骨架項目,我們只需要通過mvn clean install 命令把該jar包安裝到本地倉庫,然后通過本地倉庫中的該jar包來生成一個項目看看效果,使用如下命令:

     mvn archetype:generate 
      -DgroupId=comthebeastshop 
      -DartifactId=beast-test 
      -Dpackage="com.thebeastshop.test" 
      -DarchetypeGroupId=com.thebeastshop 
      -DarchetypeArtifactId=beast-archetype -DarchetypeVersion=1.1 -X -DarchetypeCatalog=local

    三、手寫maven多module的項目骨架archetype

    1.多模塊骨架項目的項目結構

    如何寫Maven的archetype項目腳手架

    這跟單模塊項目區(qū)別不大,但是有幾個概念需要說明:

    • “__rootArtifactId__”占位符會被parent項目的artifactId替換

    • ${rootArtifactId}也會被parent項目的artifactId替換

    • src/main/resources/archetype-resources里必須要有一個頂級pom文件(如果是單工程就是工程pom文件),同時子文件夾代表了模塊定義

    2.模板工程定義描述文件

    META-INF/maven/archetype-metadata.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <archetype-descriptor  name="beast-archetype"
            xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="
                http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0
                http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd">
    
        <requiredProperties>
            <requiredProperty key="groupId">
                <defaultValue>com.thebeastshop</defaultValue>
            </requiredProperty>
            <requiredProperty key="artifactId">
                <defaultValue>test</defaultValue>
            </requiredProperty>
            <requiredProperty key="package">
                <defaultValue>com.thebeastshop.test</defaultValue>
            </requiredProperty>
        </requiredProperties>
    
        <modules>
            <module id="${rootArtifactId}-api" name="${rootArtifactId}-api" dir="__rootArtifactId__-api">
                <fileSets>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/test/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/test/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                </fileSets>
            </module>
            <module id="${rootArtifactId}-core" name="${rootArtifactId}-core" dir="__rootArtifactId__-core">
                <fileSets>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/test/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8">
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/test/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                </fileSets>
            </module>
            <module id="${rootArtifactId}-dao" name="${rootArtifactId}-dao" dir="__rootArtifactId__-dao">
                <fileSets>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/test/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8">
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                            <include>mapper</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/test/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                </fileSets>
            </module>
            <module id="${rootArtifactId}-main" name="${rootArtifactId}-main" dir="__rootArtifactId__-main">
                <fileSets>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/test/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8">
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/test/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/main/assembly</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/main/bin</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                </fileSets>
            </module>
            <module id="${rootArtifactId}-mybatisGen" name="${rootArtifactId}-mybatisGen" dir="__rootArtifactId__-mybatisGen">
                <fileSets>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet filtered="true" encoding="UTF-8" packaged="true">
                        <directory>src/test/java</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                    <fileSet encoding="UTF-8">
                        <directory>src/test/resources</directory>
                        <includes>
                            <include>**/*.*</include>
                        </includes>
                    </fileSet>
                </fileSets>
            </module>
        </modules>
    </archetype-descriptor>

    屬性變量定義

    <requiredProperties>
        <requiredProperty key="groupId">
            <defaultValue>com.thebeastshop</defaultValue>
        </requiredProperty>
        <requiredProperty key="artifactId">
            <defaultValue>test</defaultValue>
        </requiredProperty>
        <requiredProperty key="package">
            <defaultValue>com.thebeastshop.test</defaultValue>
        </requiredProperty>
    </requiredProperties>

    這些屬性可以在資源元文件里的任意一個文件里通過${var}來引用,所以的元文件最終都可以選擇通過velocity引擎來執(zhí)行替換后生成。
    默認的屬性有:groupId,artifactId,packeage,version等

    項目子模塊定義

    <modules>
        <module id="${rootArtifactId}-api" name="${rootArtifactId}-api" dir="__rootArtifactId__-api">
            ...
        </module>
        <module id="${rootArtifactId}-core" name="${rootArtifactId}-core" dir="__rootArtifactId__-core">
            ...
        </module>
        <module id="${rootArtifactId}-dao" name="${rootArtifactId}-dao" dir="__rootArtifactId__-dao">
            ...
        </module>
        <module id="${rootArtifactId}-main" name="${rootArtifactId}-main" dir="__rootArtifactId__-main">
            ...
        </module>
        <module id="${rootArtifactId}-mybatisGen" name="${rootArtifactId}-mybatisGen" dir="__rootArtifactId__-mybatisGen">
            ...
        </module>
    </modules>

    module有三個屬性,解釋如下:

    • id :定義子模塊工程的artifactId.

    • dir :子模塊工程源文件在archetype-resources里對應的directory.

    • name :子模塊的名字.

    3.子模塊pom.xml定義如下(以core模塊為例):

    <?xml version="1.0"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>com.thebeastshop</groupId>
            <artifactId>${rootArtifactId}</artifactId>
            <version>${version}</version>
        </parent>
    
        <artifactId>${artifactId}</artifactId>
        <name>${artifactId}</name>
        
        <dependencies>
            <dependency>
                <groupId>com.thebeastshop</groupId>
                <artifactId>${rootArtifactId}-api</artifactId>
                <version>${api.version}</version>
            </dependency>
            <dependency>
                <groupId>com.thebeastshop</groupId>
                <artifactId>${rootArtifactId}-dao</artifactId>
                <version>${project.parent.version}</version>
            </dependency>
        </dependencies>
        
        <build>
            <plugins>
                 <plugin> 
                     <artifactId>maven-deploy-plugin</artifactId> 
                     <configuration> 
                        <skip>true</skip> 
                     </configuration> 
                 </plugin>
            </plugins>
        </build>
    </project>

    其中${rootArtifactId}就代表父項目的artifactId.

    4.我們和單模塊腳手架工程一樣,通過mvn clean install命令把該腳手架項目安裝到本地maven倉庫,然后就可以使用該項目來快速生成新項目結構了,生成命令如下:

    mvn archetype:generate 
      -DgroupId=com.thebeastshop 
      -DartifactId=ddd 
      -Dversion=1.0.0-SNAPSHOT
      -DarchetypeGroupId=com.thebeastshop 
      -DarchetypeArtifactId=beast-archetype 
      -DarchetypeVersion=1.3-SNAPSHOT -X -DarchetypeCatalog=local

    我們就會看到生成好的項目結構如下:

    如何寫Maven的archetype項目腳手架

    多模塊項目腳手架源碼:https://github.com/hafizzhang/beast-archetype

    關于“如何寫Maven的archetype項目腳手架”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI