最近在公司经常要写一些 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