一直就想试验下Maven的插件编写。而最近在看Cat源码时,发现其子项目cat-maven-plugin中对Maven插件的应用,于是乘热打铁自己实践了一个。
1. pom.xml
在插件项目的Maven配置文件中引入如下依赖
<groupId>com.lq.learning.springboot</groupId>
<!--
一般来说,我们会将自己的插件命名为 <myplugin>-maven-plugin,而不推荐使用 maven-<myplugin>-plugin
-->
<artifactId>lq-maven-plugin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 注意这里, 必须是maven-plugin -->
<!-- 这里可能会导致eclipse报错, 不需要在意, 程序是可以正常运行的 -->
<packaging>maven-plugin</packaging>
<name>springboot-mavenPlugin</name>
<prerequisites>
<maven>3.0.3</maven>
</prerequisites>
<dependencies>
<!--引入Mojo-->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
2. 编写实现类
/**
* 以下JavaDoc注解意味着将绑定到install目标上(plugin goal)
* @goal install
* @aggregator true
* @author LQ
* @see cat-maven-plugin项目中的{@code InstallMojo}
*
* <pre> 使用
* 1. 对本项目进行 {@code mvn clean install} . 将本项目安装到maven私服上去
* 2. 在其他项目中以 {@code <pluginManagement>} 的方式引入上面的项目
* 3. 命令行执行 mvn com.lq.learning.springboot:lq-maven-plugin:0.0.1-SNAPSHOT:install
* 命令简化版: mvn lq:install
* 4.
* </pre>
*/
public class InstallMojo extends AbstractMojo {
/**
* 关于这两个参数的意义, 参见下方截图
* lqMsgs 为插件内部使用的参数名
* msgs 则是外部提供参数时使用的; 若不是很明白, 可以直接跳到下一小节看实际的应用
* @parameter property="lqMsgs"
* @readonly
*/
private List<String> msgs;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
final String info = String.format("外界传递来的参数为: [ %s ]", msgs);
getLog().info(info);
System.out.println(info);
}
}
注意观察参数msgs
和lqMsgs
的位置区别
3. 安装Plugin
在插件项目的根目录下执行mvn clean install
. 将插件安装到maven私服上去。`
4. 使用该plugin
需要使用该插件的项目,在其pom.xml中载入如下内容:
<build>
<!-- 注意这里我们不是直接放到了plugins根节点下 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>com.lq.learning.springboot</groupId>
<artifactId>lq-maven-plugin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<configuration>
<msgs> <!--给插件传参list, 注意这里的参数名 -->
<param>L</param>
<param>Q</param>
</msgs>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
然后命令行切到该项目的根目录下,执行
// 完整版命令
mvn com.lq.learning.springboot:lq-maven-plugin:0.0.1-SNAPSHOT:install
// 简约版
mvn lq:install
5. 注意
如果恰巧你和我一样,是使用SpringBoot来进行这个练习的,这里需要注意一下。因为默认情况下SpringBoot是使用如下plugin进行编译安装的:
<!-- 导致被编译的类出现在BOOT-INF 文件夹下, 进而出现无法加载到类的错误 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
此时只需要换成如下插件再执行一次mvn clean install
即可。
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
6. Links