背景:
经常要搭建新项目架构,以前都是copy paste
很繁琐,久而久之,会磨灭人的心性
后来我自己写了template项目,使用批处理来创建新项目,以后有机会和大家分享下这个心得
但是自己感觉不高大上
后来看到了 Maven Archetype Plugin http://maven.apache.org/archetype/maven-archetype-plugin/
非常不错
坑
不过有些坑
这不,当我使用 Create an archetype from a multi-module project 的时候
http://maven.apache.org/archetype/maven-archetype-plugin/examples/create-multi-module-project.html
我的项目是这样的目录
feilong-platform.
├─.settings
├─feilong-daemon
│ ├─.settings
│ └─src
│ ├─main
│ │ ├─java
│ │ └─resources
│ └─test
│ ├─java
│ └─resources
├─feilong-frontend
│ ├─.settings
│ └─src
│ ├─main
│ │ ├─java
│ │ └─resources
│ └─test
│ ├─java
│ └─resources
├─feilong-mobile
│ ├─.settings
│ └─src
│ ├─main
│ │ ├─java
│ │ └─resources
│ └─test
│ ├─java
│ └─resources
├-feilong-repo
│ ├─.settings
│ └─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─feilongarchetype
│ │ │ ├─dao
│ │ │ ├─manager
│ │ │ ├─model
│ │ │ ├─util
│ │ │ └─web
│ │ │ ├─controller
│ │ │ ├─filter
│ │ │ ├─interceptor
│ │ │ ├─servlet
│ │ │ └─view
│ │ └─resources
│ └─test
│ ├─java
│ └─resources
└─feilong-sitemanager
├─.settings
└─src
├─main
│ ├─java
│ └─resources
└─test
├─java
└─resources
父项目的名字是 feilong-platform
下面有四个子modoule
<modules>
<module>feilong-repo</module>
<module>feilong-frontend</module>
<module>feilong-sitemanager</module>
<module>feilong-daemon</module>
<module>feilong-mobile</module>
</modules>
运行
mvn -DdefaultEncoding=utf-8 -Darchetype.filteredExtensions=java archetype:create-from-project
创建出来的骨架是这样的
按照官方文档说明, 里面的目录应该变成 可变参数 "__rootArtifactId__"
但是我试过无数遍,死活还是老样子
查遍了官方文档,无迹;
查阅了,stackoverflow,无果;
解决方案:
好吧,古人云:"源码面前,了无秘密~"
直接看 maven-archetype-plugin 源码
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-archetype-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>
跟踪代码下来,发现
org.apache.maven.archetype.creator.FilesetArchetypeCreator 495 line
for ( Iterator<String> modules = pom.getModules().iterator(); modules.hasNext(); )
{
String subModuleId = modules.next();
String subModuleIdDirectory = subModuleId;
if ( subModuleId.indexOf( rootArtifactId ) >= 0 )
{
subModuleIdDirectory = StringUtils.replace( subModuleId, rootArtifactId, "__rootArtifactId__" );
}
createModulePoms( pomReversedProperties, rootArtifactId, packageName,
FileUtils.resolveFile( basedir, subModuleId ),
FileUtils.resolveFile( archetypeFilesDirectory, subModuleIdDirectory ), preserveCData,
keepParent );
}
好嘛, 原来,子module 的名字不能随便取的, 需要有父module 的前缀
比如 父module rootArtifactId 叫 feilong-platform,那么 子module repo 需要叫 feilong-platform-repo
不能叫 feilong-repo
发现了这个新大陆之后,很开心,重新修改项目结构
feilong-platform
├─.settings
├─feilong-platform-daemon
│ ├─.settings
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ └─resources
│ │ └─test
│ │ ├─java
│ │ └─resources
│ └─target
│ ├─classes
│ └─test-classes
├─feilong-platform-frontend
│ ├─.settings
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ └─resources
│ │ └─test
│ │ ├─java
│ │ └─resources
│ └─target
│ ├─classes
│ └─test-classes
├─feilong-platform-mobile
│ ├─.settings
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ └─resources
│ │ └─test
│ │ ├─java
│ │ └─resources
│ └─target
│ ├─classes
│ └─test-classes
├─feilong-platform-repo
│ ├─.settings
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ │ └─com
│ │ │ │ └─feilongarchetype
│ │ │ │ ├─dao
│ │ │ │ ├─manager
│ │ │ │ ├─model
│ │ │ │ ├─util
│ │ │ │ └─web
│ │ │ │ ├─controller
│ │ │ │ ├─filter
│ │ │ │ ├─interceptor
│ │ │ │ ├─servlet
│ │ │ │ └─view
│ │ │ └─resources
│ │ └─test
│ │ ├─java
│ │ └─resources
│ └─target
│ ├─classes
│ └─test-classes
└─feilong-platform-sitemanager
├─.settings
├─src
│ ├─main
│ │ ├─java
│ │ └─resources
│ └─test
│ ├─java
│ └─resources
└─target
├─classes
└─test-classes
再次执行
mvn -DdefaultEncoding=utf-8 -Darchetype.filteredExtensions=java archetype:create-from-project
结果
bingo,成功了
参考: