Maven 自定义 archetype

时间:2023-03-08 16:44:32

最近在公司经常要写一些 storm-job 工程的骨架(archetype)非常相似,为了能够将大家的工程结构固定下来以及节约建工程的成本,所以给组内自定义了maven-archetype,中途遇到了一些坑。

一、archetype工程

这里记录一下.首先archetype本身就是一个Maven工程,所以需要按照Maven工程的基本结构构建工程。如图-1所示

 
archetype
|-- pom.xml
`-- src
`-- main
`-- resources
|-- META-INF
| `-- maven
| `--archetype-metadata.xml
`-- archetype-resources
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- App.java
`-- test
`-- java
`-- AppTest.java

图-1 archetype工程结构

其中 archetype-metadata.xml文件的作用是为了描述,根据此骨架生成的工程应该包含的文件,具体设置如下:

 
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="miuse-job-archetype">
<fileSets>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/java</directory>
<includes>
<include>**/*.**</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/**</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/test/java</directory>
<includes>
<include>**/*.**</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory></directory>
<includes>
<include>.**</include>
</includes>
</fileSet>
</fileSets>
</archetype-descriptor>

二、主要遇到的问题有

1. 为了能够规范工程各个模块,需要在新工程中包含部分空包(empty package)?

需要在archetype工程根目录下面的pom.xml (archetype/pom.xml)的文件中,通过增加maven-resource-plugin,并且设置<includeEmptyDirs>true</includeEmptyDirs>将空文件夹打包进工程中。

 
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<configuration>
<includeEmptyDirs>true</includeEmptyDirs>
</configuration>
</plugin>
</plugins>
</build>

2. 怎么能够在新建工程中生成 groupID的结构,比如:gourpId: com.company.group.test,应该生成 com/company/group/test 的文件结构,并且在目录里面的 java文件的 package com.company.group.test;

archetype
|-- pom.xml
`-- src
`-- main
`-- resources
|-- META-INF
| `-- maven
| `--archetype-metadata.xml
`-- archetype-resources
|-- pom.xml
`-- src
|-- main
| `-- java
| `—__packageInPathFormat__(groupId)
                    |          `—__artifactId__ (artifactId)
                    |            `— 包名
`-- test
`-- java
`-- AppTest.java

其中_ _packageInPathFormat_ _ 为双下划线,表示gruopId。

3. 包中java 文件的 package 能够根据groupId生成?

#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
package ${package}.${artifactId}.app;
public class App{
public static void main(String[] args) {
System.out.println("Hello Muise Job");
}
}

最后只要配置maven-archetype 发布地址,mvn deploy将响应的工程发布即可。

参考文献:

1. https://maven.apache.org/guides/mini/guide-creating-archetypes.html