经常要搭建新项目架构,以前都是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
我的项目是这样的目录
baozun-platform. ├─.settings ├─baozun-daemon │ ├─.settings │ └─src │ ├─main │ │ ├─java │ │ └─resources │ └─test │ ├─java │ └─resources ├─baozun-frontend │ ├─.settings │ └─src │ ├─main │ │ ├─java │ │ └─resources │ └─test │ ├─java │ └─resources ├─baozun-mobile │ ├─.settings │ └─src │ ├─main │ │ ├─java │ │ └─resources │ └─test │ ├─java │ └─resources ├─baozun-repo │ ├─.settings │ └─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─feilongarchetype │ │ │ ├─dao │ │ │ ├─manager │ │ │ ├─model │ │ │ ├─util │ │ │ └─web │ │ │ ├─controller │ │ │ ├─filter │ │ │ ├─interceptor │ │ │ ├─servlet │ │ │ └─view │ │ └─resources │ └─test │ ├─java │ └─resources └─baozun-sitemanager ├─.settings └─src ├─main │ ├─java │ └─resources └─test ├─java └─resources
父项目的名字是 baozun-platform
下面有四个子modoule
<modules> <module>baozun-repo</module> <module>baozun-frontend</module> <module>baozun-sitemanager</module> <module>baozun-daemon</module> <module>baozun-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 叫 baozun-platform,那么 子module repo 需要叫 baozun-platform-repo
不能叫 baozun-repo
发现了这个新大陆之后,很开心,重新修改项目结构
baozun-platform ├─.settings ├─baozun-platform-daemon │ ├─.settings │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ └─resources │ │ └─test │ │ ├─java │ │ └─resources │ └─target │ ├─classes │ └─test-classes ├─baozun-platform-frontend │ ├─.settings │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ └─resources │ │ └─test │ │ ├─java │ │ └─resources │ └─target │ ├─classes │ └─test-classes ├─baozun-platform-mobile │ ├─.settings │ ├─src │ │ ├─main │ │ │ ├─java │ │ │ └─resources │ │ └─test │ │ ├─java │ │ └─resources │ └─target │ ├─classes │ └─test-classes ├─baozun-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 └─baozun-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,成功了