Maven技巧之编写插件

一直就想试验下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);
    }
}

注意观察参数msgslqMsgs的位置区别
Maven编译结果

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>
  1. maven插件实现
  2. Maven 插件编写 之 初识 Mojo
  3. cat-maven-plugin
  4. 官方文档 还是相当详细的

猜你喜欢

转载自blog.csdn.net/lqzkcx3/article/details/80670411