前言
公司项目需要发布link文件到tomcat服务的指定目录下,目前前辈们写的插件都是eclipse插件版本,研究下maven 插件实现提供给maven项目使用。
基本准备
- maven 将每一个插件的goal定义为mojo(Maven plain Old Java Object),每一个插件定义需要实现Mojo的字类
- 在mojo里面获取pom的定义可以通过@Parameter注解自动注入
- 几个默认的pom 对象:
- ${project.basedir} 项目的根目录
- ${project.build.finalName} 项目最终的打包名称
实现方式
1 新建一个maven项目,将打包方式修改为
<packaging>maven-plugin</packaging>
复制代码
2、pom 添加build 依赖
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
复制代码
3、编写mojo实现
@Mojo(name = "deploy-link")
public class DeployLinkMojo extends AbstractMojo {
private NetilerProjectHandle project;
@Parameter(required = true)
private String serverPath;
@Parameter(defaultValue = "${project.basedir}")
private String projectPath;
@Parameter(defaultValue = "${project.build.finalName}")
private String finalName;
/**
* created by vision 2021-10-9 发布link文件的具体实现
* @throws MojoExecutionException
* @throws MojoFailureException
*/
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.println("start execute project : " + projectPath);
project = new NetilerProjectHandle(serverPath, projectPath, finalName);
//删除相关jar与link文件
project.deleteRelateFile();
//写文件
project.createLinkFile();
}
}
复制代码
注意点:
@Mojo 代表插件的执行目标
@Parameter 代表参数,可以获取pom文件的定义
execute() 插件目标的具体实现
其他项目在pom-build 引用:
<plugin>
<groupId>com.leadal</groupId>
<artifactId>maven-plugin-netiler</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<serverPath>D:\work\servers\leadal_kms-tomcat_8.5</serverPath>
<projectPath>${project.basedir}</projectPath>
</configuration>
</plugin>
复制代码
在idea下面使用:
遇到的问题
1、插件实现获取不到项目根目录,因为此插件需要项目根目录写到tomcat运行目录下,通过 @Parameter(defaultValue = "${project.basedir}") private String projectPath; 的方式在mojo里面获取到的值为null
多项尝试后发现这个属性需要在pom里面显示调用 ${project.basedir}
<plugin>
<groupId>com.leadal</groupId>
<artifactId>maven-plugin-netiler</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<serverPath>D:\work\servers\leadal_kms-tomcat_8.5</serverPath>
<projectPath>${project.basedir}</projectPath>
</configuration>
</plugin>
复制代码
但是 ${project.build.finalName} 就可以直接获取到,这个可能和内部实现有关,不做深究。




近期评论