文档章节

使用maven3 创建自定义的archetype

wangrikui
 wangrikui
发布于 2015/08/28 17:42
字数 1532
阅读 3132
收藏 4

、创建自己的archetype一般有两种方式,比较简单的就是create from project

1.1、首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应的目录下面
    
比如说会将一些常用的java代码存放到src/main/java目录下面;
    
会将一些通用的配置文件放到src/main/resources目录下面;

    如果是javeEE工程,还会有一些jsp等等的文件存放到src/main/webapp目录下面

 

1.2、然后在maven projectpom.xml文件中添加插件
    ================================================
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-archetype-plugin</artifactId>
            <version>2.2</version>
        </plugin>
    </plugins>
    ================================================

1.3、打开cmd窗口,cd到刚才创建的maven project的根目录,运行maven命令:
    
mvn archetype:create-from-project
    然后会在target目录下面生成generated-sources目录,这个就是生成的 archetype

1.4cd进入generated-sourced/archetype目录,运行maven命令:
    
mvn install
    这样就把自定义的archetype安装到本地仓库了。

archetype安装的地址是在maven安装目录下面的conf/settings.xml文件中指定的(<localRepository>字节)
    默认会在  ~/.m2  目录下面生成一个archetype-catalog.xml文件(和默认的settings.xml在同一个目录),
    声明了该archetypegroupIdartifactId和其他属性。
    因为Eclipse创建maven项目过程中,选择的“Default Local”指向的地址就是 ~/.m2
    所以文件archetype-catalog.xml会被eclipse自动读取,
    使用eclipse创建maven项目的时候可以在"Default Local"一项中找到刚才自定义archetype名字。

1.5、如果想要卸载刚才安装的archetype,只需要将~/.m2目录下面的archetype-catalog.xml文件中对应的<archetype>字节段删掉,
    并且把本地仓库中相应groupIdartifactId下面的文件删掉就可以了。

1.6、安装到本地仓库中的archetype只可以被自己使用,如果想要共享,那么在第四步的时候使用deploy命令,不要使用install命令。

 

二、可能遇到的一些问题

直接使用archetype:create-from-project比起手工去打造一个archetype要便捷的多,但, 有时候偷懒会有些不靠谱,archetype:create-from-project的某些行为可能会与我们最初的设想有出入,这个时候就需要我们在最终发布新创建的archetype之前,做有些后继处理,比如:

2.1. Java文件对应的package被忽略

对于要包含到archetypeJava代码文件来说, archetype:create-from-project之后, Java代码文件原来的package结构会被忽略掉,比如,对于如下类来说:

cn.spring21.app.defaults.controller.QuickStartController

archetype:create-from-project之后, archetype中对应的文件就变成了:

QuickStartController

这显然不是我们想要的结果(当然,对于不在乎这一结构的archetype来说则无所谓),为此,我们要对archetype:create-from-project之后生成的结果文件进行定制。

首先, 我们编辑文件target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml,它记载了archetype里都包含哪些文件和目录结构,将如下内容:

Xml代码  

1.  <sources>  

2.    <source>src/main/java/QuickStartController.java</source>  

3.  </sources>  

 

变更为:

Xml代码 

1.  <sources>  

2.    <source>src/main/java/cn/spring21/app/defaults/controller/QuickStartController.java</source>  

3.  </sources>  

 

 

然后,将以上文件和目录结构创建或者Copy到如下目录:

target/generated-sources/archetype/src/main/resources/archetype-resources/src/main/java

所有这些做完之后,Java源代码文件结构就可以保持了。

虽然想要的Java源代码目录结构可以保持住了,不过, 还会有一个烦人的地方,如果我们在使用这个archetype创建新的project的时候,不明确指定packageName,那maven自作多情的把groupId作为Java文件的package,前缀到原来的package前面。比如, 如果我原来java文件对应:

cn/spring21/app/defaults/controller/QuickStartController.java

而创建项目的时候, 指定“-DgroupId=cn.spring21”,那么,最后生成的项目中, 对应的Java文件就跑到了“cn/spring21/cn/spring21/app/defaults/controller/QuickStartController.java”stupid

要解决这个问题, 可以在使用archetype创建project的时候,明确将packageName指定为空:

mvn archetype:create -DarchetypeGroupId=archetypeGroupId-DarchetypeArtifactId=archetypeArtifactId-DarchetypeVersion=0.0.2-SNAPSHOT -DgroupId=cn.spring21-DartifactId=sample -Dversion=0.0.1-SNAPSHOT -DpackageName=

唯一不爽的就是命令行实在实在太长了。

2.2. 多余文件的清理

有时候, archetype:create-from-project会把一些不必要的文件和目录结构也包含到最终的archetype中, 我们可以通过编辑文件target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml来清理这些不必要包含的文件和目录结构。

比方说,如果我们是使用EclipseIDE来搭建要做成archetypeproject的话,一些EcilpseIDE特有的文件和目录,比如.settings目录啦,.classpath/.project文件啦,都会被copyarchetype的目录下,这时候,我们就可以把archetype-metadata.xml文件中对应这些文件和目录的<fileset>元素删除掉来清理它们。

2.3. 二进制文件的损坏

如果某些二进制文件要包含到archetype当中, 比如, 常见的图片文件, 我们需要编辑archetype.xml文件中对应这些文件的<resource>元素配置,为这些元素添加filtered="false"的属性, 否则的话,当使用这个archetype来创建新的工程的时候,这些二进制文件就会废废了,原因嘛,还是因为maven自作多情,呵呵,居然把图片当Velocity模板来看待。

© 著作权归作者所有

wangrikui
粉丝 10
博文 31
码字总数 20614
作品 0
南京
后端工程师
私信 提问
加载中

评论(1)

嘚儿个没
嘚儿个没
很感谢你的分享。我用maven 3.3.9的时候出现错误,说找不到mvn.bat,后面发现是从3.3.3后mvn.bat更名为mvn.cmd,需要复制一个mvn.cmd并重命名为mvn.bat,才能够正确运行

暂无文章

用Javascript评估用户输入密码的强度

密码已经是我们生活工作中必不可少的工具,但一个不安全的密码有又有可能会给我们造成不必要的损失。作为网站设计者,如果我们在网页中能对用户输入的密码进行安全评估,并显示出相应的提示信息...

花漾年华
29分钟前
0
0
Python 打开目录与指定文件

Python打开外部文件有很多方法, os.popen打开外部程序,但发现只能打开文件所在目录的文件 os.system可打开外部文件os.system(command) command 要执行的命令,相当于在Windows...

shzwork
31分钟前
2
0
Leetcode # 118:Pascal's Triangle 杨辉三角

118:Pascal's Triangle 杨辉三角 Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. 给定一个非负整数 *numRows,*生成杨辉三角的前 numRows 行。 ......

iCodeBugs
41分钟前
1
0
IntelliJ IDEA导入Gradle项目

1.File > Open 找到项目后选择build.gradle文件,点击ok image 2.点击Open as Project image 3.选择本地Gradle以及JDK image 4.点OK完成...

青峰Jun19er
45分钟前
2
0
Python实现斐波那契数列

斐波那契数列大家都很熟悉吧,咱们在高中学数学的时候,老师会讲这个定律以及算法,其实数据结构和数学息息相关,数学思维好的往往逻辑思维就比较好,今天小猿圈带大家学习一下python的斐波那...

小猿圈加加
46分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部