`
fujohnwang
  • 浏览: 156479 次
社区版块
存档分类
最新评论

自定义Mave archetype的创建

    博客分类:
  • Tech
阅读更多

阅读级别: basic level

以下只是Maven自定义Archetype创建的简单流程以及期间可能碰到的问题的一些整理性内容,大部分内容从Maven的官方站点或者相关书籍中都可以找到。

关于Archetype是个什么东西,我想用过Maven的都不用说了, 没用过的也没关系, 简单来讲, 就是一堆预先设定好的项目结构文档, 有了这个东西,在新建同一类型的项目的时候,就不用又从头捣鼓一遍, 比如,从这个项目抓个log4j.xml改一下,到那个项目抓一个web.xml文件改一下等等。预先建立一个针对某种场景下使用的archetype, 用的时候只需要运行一条命令就所有东西都备齐了。就是这么个简单的东西, appfuse啦, springside啦,应该都类似于这种东西,体现形式不同而已。

1. 创建Maven自定义Archetype一般流程

创建Maven自定义Archetype通常有两种方式, 为了便捷,我们选择create-from-project的方式,所以, 首先,我们会新建一个maven project,然后把杂七杂八的那些共用的东西都“摆放 ”在合适的位置上,这可能包括:

  • 将某些实例用Java代码放到src/main/java目录下;

  • 某些通用的配置文件放到src/main/resources目录下;

  • 如果是为基于j2ee的web应用搭建archetype,那可能又得在src/main/webapp下创建相应的文件和目录结构,等等...

当你感觉所有这些东西都准备齐活之后,就可以开始最后的工序了。

首先, 要创建archetype,当然是要先把maven的archetype plugin添加到pom.xml中啦:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins<groupId>
        <artifactId>maven-archetype-plugin<artifactId>
        <version>2.0-alpha-4<version>
    </plugin>
...
</plugins>
 

之后, 就可以开个命令行窗口,进入当前project所在目录,敲下:

user@host:~$ mvn archetype:create-from-project
 

之后, 创建好的archetype就跑到了当前目录下的次一级目录target/generated-sources/archetype/ ,所以,我们接着敲键盘:

user@host:~$ cd target/generated-sources/archetype/
user@host:~$ mvn install
 

将该创建好的archetype安装到本地的repository之后, 我们就可以使用它了:

mvn archetype:generate -DarchetypeCatalog=local
 

如果使用m2eclipse,那在创建项目的时候,选择使用Default Local的Catalog,应该也可以看到并选择新安装到这个archetype。

安装到本地的repository只能自己用,所以,如果是比较通用的archetype,可以deploy到组织内部架设的maven repository服务上去。

2. 可能遇到的一些问题

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

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

对于要包含到archetype的Java代码文件来说, 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.xml ,它记载了archetype里都包含哪些文件和目录结构,将如下内容:

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

变更为:

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

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

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

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

Note
[Note]

虽然想要的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来搭建要做成archetype的project的话,一些EcilpseIDE特有的文件和目录,比 如.settings目录啦, .classpath/.project文件啦,都会被copy到archetype的目录下,这时候,我们就可以把archetype- metadata.xml文件中对应这些文件和目录的<fileset>元素删除掉来清理它们。

2.3. 二进制文件的损坏

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

有关这个问题,也可以参考这个JIRA issue 来了解更多细节。

3. 最初草稿

since the "archetype:create-from-project" is the simplest way to create an archetype, most of the time, it's the way we will resort to , but in order to make it work for us properly, or say, to make it work as we want it to, we need to do some custom work after running the command "mvn archetype:create-from-project", here is some tips you may need.

Note
[Note]

first of all, we should come to the same point that all of the artifacts generated locate at "target/generated-sources/archetype" folder after running "mvn archetype:create-from-project" command.

 

  • for java code we want to include into the archetype, the default behavior from "archetype:create-from-project" is that it will ignore the package structure, e.g. if we have a source folder with package structure , below:

    cn.spring21.app.defaults.controller.QuickStartController

    but with the default behavior from "archetype:create-from-project", the final structure will be only java file left. that's,

    QuickStartController

    that's not what we want, we want to keep the package structure as it is. so we need to customize this.

    go to "target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype.xml", change following part:

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

    to:

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

    then, copy or create such folder structure under :

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

    after all of this, the original folder structure will be retained.

    Note
    [Note]

    when creating a project with our archetype above, in order to create a source folder with default package we assigned, the "packageName" environment attribute must be assigned to empty, so command seems like : mvn archetype:create -DarchetypeGroupId=archetypeGroupId -DarchetypeArtifactId=archetypeArtifactId -DarchetypeVersion=0.0.2-SNAPSHOT -DgroupId=cn.spring21 -DartifactId=sample -Dversion=0.0.1-SNAPSHOT -DpackageName= pay attention to the last -DpackageName= , no value is assigned.

  • sometimes, "archetype:create-from-project" will include other unnecessary filess into the final package, we can clean this by editing "target/generated-sources/archetype/src/main/resources/META-INF/maven/archetype-metadata.xml", for example, if we set up a project for archetype in Eclipse IDE, several files specific to Eclipse IDE will be included, these files can be removed by deleting "fileset" elements which are setup for them.

  • for binary files, e.g. images, we need to edit archetype.xml entry for these resources, and add "filtered="false"" attribute to their <resource> elements. Otherwise , when create a project with this archetype, the binary files will be corrupted. Because velocity try to process it.

    See JIRA issure from http://jira.codehaus.org/browse/ARCHETYPE-19 for this problem.

 

0
0
分享到:
评论
1 楼 飘零雪 2012-02-25  
[b][/b][i][/i][u][/u]
引用

相关推荐

    maven archetype

    Maven Archetype 是 Maven 的强大特性之一,它简化了新项目的初始化过程,提供了标准化的项目结构,并允许开发者根据需求创建和共享自定义的项目模板。了解和熟练使用 Maven Archetype,能有效提升开发效率,让项目...

    maven_archetype

    - **可复用**:开发团队可以创建自定义的 archetype,用于内部项目,确保团队内部的项目结构一致性。 - **版本控制**:archetype 可以随着项目需求的变化而更新,新版本的 archetype 会包含最新的最佳实践和依赖。 ...

    一个SSM框架的maven archetype

    5. 使用SSM archetype创建项目: 要使用这个SSM archetype,首先需要在命令行或IDE中运行maven的archetype插件,输入相应的groupId、artifactId和version信息。完成后,会生成一个包含SSM框架配置文件、基本目录...

    自定义maven插件的实现

    然而,有时候Maven的内置插件无法满足特定的需求,这时就需要自定义Maven插件来扩展其功能。本篇文章将深入探讨如何实现自定义的Maven插件。 首先,了解Maven插件的基本结构至关重要。一个Maven插件通常由一组Mojo...

    【maven】多子模块maven模板工程archetype创建过程

    【maven】多子模块maven模板工程archetype创建过程 在软件开发中,Maven作为Java项目管理和构建工具,提供了强大的依赖管理功能。而Maven的Archetype插件则可以帮助开发者快速创建新项目的模板,尤其对于有多个子...

    java maven archetype-catalog.xml

    此外,Maven骨架可以自定义,开发者可以创建自己的骨架来满足特定项目需求。骨架创建完成后,可以通过发布到私有或公共Maven仓库,让其他人使用`mvn archetype:generate`命令时能够找到并使用这些定制的骨架。 总之...

    maven archetype-catalog.xml 下载

    这个文件通常由Maven仓库维护,用于在创建新项目时提供Archetype的选择列表。当开发者运行`mvn archetype:generate`命令时,Maven会根据这个目录来查找并显示可选的Archetypes。 archetype-catalog.xml文件的结构...

    maven基础学习(四)-简单实例(使用Archetype生成项目骨架)

    6. 生成项目:Maven会根据所选Archetype创建一个新的项目目录,包含初始的pom.xml和其他必要的文件。 四、自定义Archetype 如果预定义的Archetypes不能满足需求,可以通过以下步骤创建自己的Archetype: 1. 创建...

    micaicms-web-archetype:maven之自定义archtype生成自定义项目骨架 1.该项目是一个自定义的archetype,通过该archetype可以生成一个自定义的基础项目框架 2.改项目框架由:Spring,SpringMVC,MyBatis,架构,前端采用bootstrap,jquery,jstl等架构

    描述:通过maven的自定义archetype创建自定义的项目框架 1.下载项目到你的本地workspace 2.进入到你该项目的根目录(也就是pom.xml所在的目录) 3.执行命令把该项目安装到你的本地仓库 mvn clean install 4.执行命令...

    SpringMVC精品资源--maven之自定义archtype生成自定义项目骨架 1.该项目是一个自定义的arch.zip

    总的来说,通过自定义Maven Archetype,我们可以标准化项目创建过程,提高开发效率,同时确保新项目的结构与团队的编码标准相一致。对于SpringMVC这样的复杂框架,这种自动化初始化可以极大地简化开发者的初期工作,...

    Maven 项目模板archetype-catalog.xml

    开发者也可以创建自己的Maven Archetype,通过编写`pom.xml`和模板目录结构,然后打包成JAR发布到私有或公共Maven仓库。这样,其他开发者就可以通过`archetype-catalog.xml`来访问并使用这些自定义的项目模板。 ...

    maven自定义catalog

    要自定义Maven的catalog,你需要按照以下步骤操作: 1. **创建自定义Archetype**: 首先,你需要创建一个自定义的Maven Archetype。这通常涉及编写一个基础项目,然后使用`mvn archetype:create-from-project`命令将...

    archetype-catalog.xml

    当你在IntelliJ IDEA(简称IDEA)中创建一个新的Maven项目并选择“从Archetype创建”时,IDEA会尝试下载这个`archetype-catalog.xml`文件来获取可用的项目模板列表。如果你遇到“Download plugins for”卡住的问题,...

    maven-archetype-quickstart-1.4.jar.zip

    `maven-archetype-quickstart` 就是这样一个模板,用于创建一个简单的Java应用,包含一个主类和一个JUnit测试类。当我们使用`mvn archetype:generate`命令并指定这个archetype时,Maven会自动生成一个全新的项目结构...

    gwt-maven-archetype source code

    标签 "源码" 表明我们要分析的是这个archetype的源代码,这将包括Maven的POM.xml文件,以及任何自定义的GWT模块、Java类、资源文件等。"工具"标签则意味着这个archetype是一个实用工具,帮助开发者加速开发流程。 ...

    maven archetye 路径

    Maven Archetype是Apache Maven中的一个重要工具,它允许开发者创建可重复使用的项目模板。这些模板可以快速初始化一个新的Maven项目,包含特定的目录结构、文件和基本配置,大大简化了项目的搭建过程。在Maven ...

Global site tag (gtag.js) - Google Analytics