`

【飞天奔月出品】maven create-from-project 之 multi-module project

阅读更多

背景:

 

经常要搭建新项目架构,以前都是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,成功了 

 

 

参考:

 

http://stackoverflow.com/questions/12830002/maven-archetype-not-using-properties-to-create-module-names#12842422

  • 大小: 4.6 KB
  • 大小: 5.1 KB
分享到:
评论
2 楼 飞天奔月 2015-04-23  
heydaytoheyong 写道

雍雍 最近怎么样
1 楼 heydaytoheyong 2015-04-21  

相关推荐

Global site tag (gtag.js) - Google Analytics