本文中将介绍 maven 的自定义插件(入门实战)自定义 archeType 模板(实战)按环境打包(实战)三个在私服中常常需用的操作。
1、自定义 archeType 模板的创建
1.1、什么是 archeType
我们在创建 maven 项目的时候,你会发现有这么多的 apache 提供的模板。
或者使用 mvn archetype:generate 命令来快速创建 maven 项目,也会有很多个选项,让你选择模板序号。那每个模板之间有什么区别呢?
每个模板里其实就是附带不同的依赖和插件。一般在公司私服里都会有属于本公司的一套 archeType 模板,里面有着调试好的项目用到的依赖包和版本号。
1.2、创建 archetype
假如自己已经有了一个 maven 项目,想给该项目创建一个 archeType 模板。
cd 到项目根目录下执行(pom.xml 同级目录)。
此时会在项目 target 下生成这些文件:
1.3、生成 archetype 模板
先 cdtarget/generated-sources/archetype/
然后执行 mvn install
执行成功后,执行 crawl 命令,在本地仓库的根目录生成 archetype-catalog.xml 骨架配置文件:
mvnarchetype:crawl
来看一看它里面的内容:
1.4、使用 archetype 模板
执行 mvn archetype:generate -DarchetypeCatalog=local 从本地 archeType 模板中创建项目。
然后会让你选择模板序号和 groupIdartifactIdversion 和 package 信息:
项目创建成功!
当然,也可以使用 IDEA 来帮我们用图形界面使用 archeType 模板创建项目:
后面的就与创建普通项目相同了,不做演示。
2、自定义插件
在这里我只是做了简单的示例,更复杂的功能开发请参考 mojo 的 API:
https://maven.apache.org/developers/mojo-api-specification.html
2.1、插件提供者
插件提供者项目结构:
2.1.1、修改 packaging
2.1.2、修改 pom
这两个依赖是自定义插件必须的依赖,代表了它是一个 Mojo 工程,里面包含了一些 Mojo 的接口和抽象类以及注解。
2.1.3、coding 业务逻辑
注意这里面的@Parameter@MojoLifecyclePhase.PACKAGE 都是 org.apache.maven.plugins.annotations 包下的:
@Parameter 注解会获取消费者配置文件中的变量值并赋值。
defaultPhase =LifecyclePhase.PACKAGE 声明了该插件触发的生命周期。
@Mojo 定义插件的 goal 名字。
2.1.4、clean and install
执行 mvn clean install,在 target 目录下会生成这样一个 jar 包,这就是插件包。
2.2、插件消费者
插件消费者 : 项目结构
2.2.1、修改 pom
如果不加,我们只能通过执行插件或者执行命令的方式来执行,如果想让它在执行 package 的时候自动执行,就需要设置该属性,可以把它理解成 hook。
2.2.2、如何传递参数给 plugin
在插件提供者中,有个 MyMojo 的类,有这样一段代码:
它和你用过的 spring 注解一样,也是用来以注解的形式获取参数的值。
相对应的,在插件消费者的配置中我们就应该相应的给出参数的定义:
上面的配置与变量名一一对应即可。这时候你会发现 maven 插件中自动会添加一个 plugins 选项:
执行该插件:mvnmyprovide:fantj 或者直接点击:
3、Profile 按环境打包
在日常开发中,我们项目的开发环境和生产环境以及测试环境往往是不同的,比如:数据库的 url 等。在项目上生产环境时,就需要修改这些参数,给开发造成不便。为了解决该问题,Maven 2.0 引入了构建配置文件的概念(build profiles)。
它能干什么呢?
假如你的生产环境和开发环境所需环境配置不同,生产环境配置文件是 pro.properties,开发环境配置文件是 dev.properties,那么用 maven profile ,你可以实现打包开发环境 jar 包的时候只将 dev.properties 打包并使用,生产环境打包同理。
在哪里声明呢?
它可以在每个项目的 pom.xml 文件中声明,也可以在 maven 的用户 setting.xml 下声明,也可以在 maven 全局环境下设置 setting.xml,详情如下。
1.Per Project
Defined in the POM itself (pom.xml).
2.Per User
Defined in the Maven-settings(%USER_HOME%/.m2/settings.xml)
3.Global
Defined in the globalMaven-settings (${maven.home}/conf/settings.xml)
4.Profile descriptor
不支持 3.0,详情请看:
虽然有这么多 define 的方式,但是我们一般使用的是第一种 defined in the pom,因为不见得每个项目的生产环境都一模一样,当然这个也是因个人情况而异。
实战
3.1、项目结构
3.2、pom.xml
3.3、三个 application.properties
3.4、打包
可以看到只将 pro/application.properties 进行了编译。
本教程中的项目源码: