1

此篇主要来谈谈maven自定义archetype,maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,此篇就不再深究maven的概念问题,侧重点来聊聊如何自定义archetype。

0x01 为什么要自定义archetype

maven也内置了很多的archetype供用户选择使用什么样的骨架去创建一个项目,比如:

  • maven-archetype-webapp

  • maven-archetype-quickstart

在创建一个maven项目的时候会列出很多archetype供选择,maven默认的archetype是maven-archetype-webapp。

但是在一个团队做开发的过程中,可能仅仅依靠maven预先提供的archetyp可能是不够的,团队之间协作有自己的定义方式,每个人的结构定义风格也不尽相同,在这样的背景下我们有必要去定义一个统一的代码骨架供团队使用,这样做的好处还有在新人加入团队的初期能够快速的理解项目。

0x02 创建自定义archetype工程

archetype是在maven-archetype-plugin插件执行generate目标的时候进行配置的,本次使用IDEA进行archetype的开发,创建archetype的目录结构如下:
图片描述

下面对上述图片中的描述进行详细的解释:

  • 根目录下boyuarchetype/pom.xml和一般的maven项目一样主要定义项目的坐标等信息。

  • 所有的项目骨架内容都集中在boyuarchetype/src/main/resources/archetype-resources中,其中的pom.xml定义了待生成项目的pom文件的内容,/src/main/java、/src/test/java中分别定义了待生成项目中相应目录下的内容。

  • boyuarchetype/src/main/resources/META-INF/maven/archetype-metadata.xml中定义相关的元数据描述。

0x03 archetype工程文件详细介绍

1.boyuarchetype/pom.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.none.budmwp</groupId>
  <artifactId>boyuarchetype</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>boyuarchetype</name>
  <url>http://maven.apache.org</url>

</project>
  • pom.xml中的packaging和普通的maven项目打包方式相同为jar,没有和插件开发的打包方式保持一致。

  • groupId一般的命名规则为公司名加项目名称,如:com.segmentfault.budmwp

  • artifactId是指budmwp这个项目中的模块名称。

  • modelVersion在maven2和maven3中都是4.0.0

2.boyuarchetype/src/main/resources/archetype-resources/pom.xml

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <version>${version}</version>
    <name>${artifactId}</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-archetype-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</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.none.budmwp

3.boyuarchetype/src/main/resources/META-INF/maven/archetype-metadata.xml

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="sample">
    <fileSets>
        <fileSet filtered="true" packaged="true">
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" packaged="true">
            <directory>src/test/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>
    </fileSets>
    <requiredProperties>
        <requiredProperty key="package-name"></requiredProperty>
    </requiredProperties>
</archetype-descriptor>
  • filtered="true"标识下面提到的${}是否要进行替换

  • packaged="true"标识boyuarchetype/src/main/resources/archetype-resources/src/main/java中对应的内容是否要放入到package中。

4.boyuarchetype/src/main/resources/archetype-resources/src/main/java/App.java

package ${package};

/**
 * @author boyu
 * @version $Id: a, v0.1 16/5/2 下午2:28 boyu Exp $.
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}
  • ${package}会被maven命令行中传进来的参数进行替换。

0x04 构建archetype工程

通过上面将一个简单的archetype工程已经搭建完成,接下来要去根据这个archetype创建我们定义好的项目骨架。
首先进入到boyuarchetype工程文件下进行make clean install这个项目,完成后会打包成boyuarchetype-1.0.jar并加入到本地仓库中,下面我们只需要根据本地仓库中的boyuarchetype-1.0.jar包去创建我们事先定义好的项目框架, mvn archetype:generate -DgroupId=com.none.budmwp -DartifactId=boyuarchetest -Dpackage="com.none.budmwp.boyuarchetest" -DarchetypeGroupId=com.none.budmwp -DarchetypeArtifactId=boyuarchetype -DarchetypeVersion=1.0 -X -DarchetypeCatalog=local

执行命令后会穿件如下的项目结构:
图片描述

好了现在可以进入到boyuarchetypetest中去执行mvn test 运行测试用例。到这里整个项目就创建完毕了。

0x05 总结

  • 初入java,进入到公司参与项目的第一件事就是拉代码学习代码,但是没有接触过过多的java开发不知道maven、eclipse所谓何物,只有依赖老手们领进门了。maven是一个很好的构建管理工具,目前java重度用户阿里、支付宝都是通过maven来进行项目构建的,所以还是有必要去了解了解maven的,未来还很遥远,让maven来提高你的项目构建效率吧。

0x06 参考资料

  • 大家可以去参考许晓斌著的maven实战一书,里面讲maven讲的很好,初学者可以快速入门。


博予liutxer
266 声望14 粉丝

专业写代码的代码仔。