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