大部分公司都会有一个通用的模板项目, 帮助你快速创建一个项目. 通常, 这个项目需要集成一些公司内部的中间件, 单元测试, 标准的代码格式, 通用的代码分层等等.
今天, 就利用 Maven 的 Archetype 插件来简单实现这一功能.
通过上面的图很清楚可以看到, 实际利用这个插件机制就简单的几个步骤:
archetype:create-from-project , 根据自己的项目代码生成原型项目
通过 install 等命令生成原型文件
archetype:generate, 通过原型生成目标项目
看起来挺简单的, 但是你会发现你用网上搜到的资料来玩的话, 你生成的项目特别傻 X, 包括官方的文档, 我也真是没搞明白他们为何那么牛逼, 一步两步.. 就他妈好了?
一堆问题, 比如 module 名称不会变, 包名变了代码中没变, 依赖报错一大堆问题, 还是有必要说下中间要怎么做的.
创建 Archetype
首先, 准备好我们自己的模板项目, 保证代码都是 OK 的.
进入项目根目录, 执行命令:
mvn archetype:create-from-project
然后项目根目录下会生成 target 文件夹, 这个很简单, 不会有任何障碍, 你看下面的图, 注意看每个模块的名字, 这是我改过的!!
你生成应该会发现他不长这样, 这就是问题啊! 接着往下看吧.
这里最核心的部分就在于怎么修改 target/generated-sources/src/main/resources/archetype-resources 下的文件.
如果不修改直接继续的话, 最终生成的项目会发现 module 的名称不会变, 包名也不会变, 代码里引用的会有一堆报错.
接着, 我们看看咋改的, 这一堆破问题.
修改父 pom
首先, 找到根目录的 pom 文件, 会发现缺少 module 信息, 这个必须加上.
- ${rootArtifactId}-client
- ${rootArtifactId}-common
- ${rootArtifactId}-service
- ${rootArtifactId}-facade
- ${rootArtifactId}-starter
父 pom 依赖引用的每个 module 也要修改, groupId 和 artifactId 按照我给出的方式来改, 不要写死!!
- ${groupId}
- ${rootArtifactId}-client
- ${project.version}
- ... ...
修改 module
这个就是图中的问题, 默认生成的 module 可能就是模板项目的名字, 需要修改成类似__rootArtifactId__-client 这种形式, 注意是双下划线.
然后 module 中的互相引用 groupId 和 artifactId 按照父 pom 的方式对应修改.
archetype-metadata 修改
找到 META-INF/maven/archetype-metadata.xml 文件, 修改 modules 相关的部分, 重点注意看 id ,dir,name 的修改方式.
- src/main/java
- **/*.java
- ... ...
修改完成之后, 进入 target/generated-sources/archetype 目录, 执行命令:
mvn install
顺便执行下 mvn deploy 上传到 nexus.
使用 Archetype
经过上面的步骤, 原型 Archetype 已经创建完成, 其实最大的坑也就是上面那部分, 花了老半天时间, 简直坑爹啊.
下面看看怎么使用吧, 两种使用方式.
命令行
随便进入你想保存项目的路径, 执行命令.
mvn archetype:generate -DarchetypeCatalog=local
依次按照提示输入 groupId,artifactId 即可完成创建.
那怎么给其他人使用?
你的本地 maven 仓库目录 (比如~/.m2/repository) 有一个文件 archetype-catalog.xml, 共享给其他人就行了.
- xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-catalog/1.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- com.example
- template-archetype
- 1.0.0-SNAPSHOT
- Example Project
- IDEA
新建项目, 选择 Maven, 勾选 Create from archetype, 选择 Add Archetype...
接着, 输入我们自定义的 Archetype 的 GroupId,ArtifactId,Version 信息.
Add 成功之后就可以在列表中看到我们自己的 archetype, 然后按照流程创建即可.
来源: http://developer.51cto.com/art/202201/699140.htm