现在的位置: 首页 > 综合 > 正文

Maven插件开发

2019年06月18日 ⁄ 综合 ⁄ 共 2926字 ⁄ 字号 评论关闭
首先,我们可以通过eclipse创建一个Maven插件项目,输入groupId和artifactId之后,在该项目的POM文件中会生成如下内容:
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
						http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.juvenxu.mvnbook</groupId>
	<artifactId>maven-loc-plugin</artifactId>
	<packaging>maven-plugin</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>Maven LOC Plugin</name>
	<url>http://www.juvenxu.com</url>

	<properties>
		<maven.version>3.0</maven.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-plugin-api</artifactId>
			<version>${maven.version}</version>
		</dependency>
	</dependencies>
</project>

Maven插件项目的POM有两个特殊的地方:
1、它的packaging必须为maven-plugin,这种特殊的打包类型能够控制Maven为其在生命周期阶段绑定插件处理相关的目标,例如在compile阶段,Maven需要为插件项目构建一个特殊插件描述符文件。
2、从上述代码中可以看到一个artifactId为maven-plugin-api的依赖,该依赖中包含了插件开发所必须得类,例如稍后会看到的AbstractMojo在CountMojo中的应用。
CountMojo代码:

/**
* Goal which counts lines of code of a project
*
* @goal count
*/
public class CountMojo extends AbstractMojo{
	
private static final String[] INCLUDES_DEFAULT = {"java", "xml", "properties"};

/**
* @parameter expression = "${project.basedir}"
* @required
* @readonly
*/
private File basedir;

/**
* @parameter expression = "${project.build.sourceDirectory}"
* @required
* @readonly
*/
private File sourceDirectory;

/**
* @parameter expression = "${project.testSourceDirectory}"
* @required
* @readonly
*/
private File testSourceDirectory;

/**
* @parameter expression = "${project.resources}"
* @required
* @readonly
*/
private List<Resource> resources;

/**
* @parameter expression = "${project.testResources}"
* @required
* @readonly
*/
private List<Resource> testResources;

/**
* @parameter
*/
private String[] includes;

public void execute() throws MojoExecutionException{
	
	if(includes == null || includes.length -- 0){
		includes = INCLUDES_DEFULT;
	}

	try{
		countDir(sourceDirectory);
		countDir(testSourceDirectory);
		
		for(Resource resource : resources){
			countDir(new File(resource.getDirectory()));
		}

		for(Resource resource : testSesources){
			countDir(new File(resource.getDirectory()));
		}

	}atch (IOException e){
		throw new MojoExecutionException("Unable to count lines of code.", e);
	}

private void countDir(File file){
	// to do somethings ...
}


}


}

首先,每个插件目标类,或者说MOJO,都必须继承AbstractMojo类并实现execute()方法,只有这样Maven才能识别该插件目标,并执行execute()方法中的行为。其次,由于历史原因,上述CountMojo类使用了Java 1.4风格的标注(将标注写在注释中),这里要关注的时@goal,任何一个Mojo都必须使用该标注写明自己的目标名称,有了目标定义之后,我们才能在项目中配置该插件目标,或者在命令行调用之,例如:

$mvn com.juvenxu.mvnbook:maven-loc-plugin:0.0.1-SNAPSHOT:count

创建一个Mojo所必要的工作就是这三项:继承AbstractMojo、实现execute方法、提供@goal标注。

接下来是如何在POM中配置插件(也可以参考签名的文章):

<plugin>
	<groupId>com.juvenxu.mvnbook</groupId>
	<artifactId>maven-loc-plugin</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<configuraction>
		<includes>
			<include>java</include>
			<include>sql</include>
		</includes>
	</configuraction>
</plugin>

如果嫌上面的命令行太长太复杂,可以将该插件的groupId添加在settings.xml中,如:

<settings>
	<pluginGroups>
		<pluginGroup>com.juvenxu.mvnbook</pluginGroup>
	</pluginGroups>
</settings>

现在Maven命令行就可以简化成:

$mvn loc:count

抱歉!评论已关闭.