开发自己的maven插件
2014-08-13 00:00
525 查看
摘要: 开发私有插件 以及 可能会遇到的问题
1,创建一个maven plugin项目
其中 archetypeGroupId 是固定的,其他的 groupId .... 你自己配置
2,配置你的plugin的快捷方式
可以看到1中生成的maven plugin 项目 也算是个标准的maven项目,找到pom.xml中的下方所示,配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.2</version>
<configuration>
<goalPrefix>sun</goalPrefix>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
goalPrefix这一项,这个是调用插件的快捷方式,如果不配置这个你调用某个plugin就是
而如果像我这里设置的则是(sun就是我的调用前缀了)
3,Mojo 类的配置。涉及2中多次出现的goal,goal就是某个具体执行目标了,一般来说一个插件一般可以执行多个功能。
@Parameter注解是给 成员变量注入 配置值,对应的在项目中要引入使用此plugin时配置如下
<plugin>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<configuration>
<port>9090</port>
</configuration>
</plugin>
这样配置信息就注入了Mojo对象内了。
这个注解 @Mojo(name="sayhi"),sayhi就是一个goal。这样的类可以有多个,当然是不同的goal。
那么如果我
4,plugin classLoader
很有可能你的插件是要作用于引用这个插件的那个maven项目的。但是plugin是被叫做plugin classLoader加载的,而这个load是没有引用方project的classPath的,也就是说在plugin代码中无法加载引用方project的类和对象。
参考:http://maven.apache.org/guides/mini/guide-maven-classloading.html
但是这样也不是说完全没有办法,我们可以通过给Mojo对象添加一个成员变量MavenProject,该对象可以获取 注解@Mojo(requiresDependencyResolution=ResolutionScope.RUNTIME)中指定的classPath路径,通过创建自己的classLoader来加载目标class就行了。
接下来你要执行 目标 maven plugin goal时仍然会发现找不到classPath那是因为项目还没有编译,而你希望你的plugin是自动执行某个maven生命周期后执行,比如在编译后执行,那么就需要 @Execute(phase = LifecyclePhase.COMPILE)
5 ,上传你的插件到自己的私服后,在设置maven的仓库为自己私服后,就可以下载使用自己插件了
1,创建一个maven plugin项目
mvn archetype:generate \ -DgroupId=sample.plugin \ -DartifactId=hello-maven-plugin \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-plugin
其中 archetypeGroupId 是固定的,其他的 groupId .... 你自己配置
2,配置你的plugin的快捷方式
可以看到1中生成的maven plugin 项目 也算是个标准的maven项目,找到pom.xml中的下方所示,配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.2</version>
<configuration>
<goalPrefix>sun</goalPrefix>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
goalPrefix这一项,这个是调用插件的快捷方式,如果不配置这个你调用某个plugin就是
mvn groupId:artifactId:version:goal
而如果像我这里设置的则是(sun就是我的调用前缀了)
mvn sun:goal
3,Mojo 类的配置。涉及2中多次出现的goal,goal就是某个具体执行目标了,一般来说一个插件一般可以执行多个功能。
package sample.plugin; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Mojo; @Mojo( name = "sayhi",requiresProject=true,requiresDependencyResolution=ResolutionScope.RUNTIME) @Execute(phase = LifecyclePhase.COMPILE) public class GreetingMojo extends AbstractMojo{ @Parameter(defaultValue = "8080",property ="port",required = false) private int port; public void execute() throws MojoExecutionException { getLog().info( "Hello, world." ); } }
@Parameter注解是给 成员变量注入 配置值,对应的在项目中要引入使用此plugin时配置如下
<plugin>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<configuration>
<port>9090</port>
</configuration>
</plugin>
这样配置信息就注入了Mojo对象内了。
这个注解 @Mojo(name="sayhi"),sayhi就是一个goal。这样的类可以有多个,当然是不同的goal。
那么如果我
mvn sun:sayhi则 该类的execute方法就会被执行。maven plugin的工作原理就是如此了。你可以动手开始你的第一个maven plugin的开发了。下面讲一些其中可能会遇到的坑。
4,plugin classLoader
很有可能你的插件是要作用于引用这个插件的那个maven项目的。但是plugin是被叫做plugin classLoader加载的,而这个load是没有引用方project的classPath的,也就是说在plugin代码中无法加载引用方project的类和对象。
参考:http://maven.apache.org/guides/mini/guide-maven-classloading.html
但是这样也不是说完全没有办法,我们可以通过给Mojo对象添加一个成员变量MavenProject,该对象可以获取 注解@Mojo(requiresDependencyResolution=ResolutionScope.RUNTIME)中指定的classPath路径,通过创建自己的classLoader来加载目标class就行了。
@Parameter(defaultValue = "${project}",required = true) private MavenProject project; private ClassLoader projectLoader; private ClassLoader getClassLoader() throws MojoExecutionException{ if(projectLoader==null){ try{ List<String> classpathElements = project.getCompileClasspathElements(); System.out.println(classpathElements); classpathElements.add(project.getBuild().getOutputDirectory() ); System.out.println(project.getBuild().getOutputDirectory()); classpathElements.add(project.getBuild().getTestOutputDirectory() ); System.out.println(classpathElements); URL urls[] = new URL[classpathElements.size()]; for ( int i = 0; i < classpathElements.size(); ++i ) { urls[i] = new File( (String) classpathElements.get( i ) ).toURI().toURL(); } projectLoader=new URLClassLoader(urls, getClass().getClassLoader() ); } catch (Exception e){ throw new MojoExecutionException("Couldn't create a project classloader.", e); } } return projectLoader; }
接下来你要执行 目标 maven plugin goal时仍然会发现找不到classPath那是因为项目还没有编译,而你希望你的plugin是自动执行某个maven生命周期后执行,比如在编译后执行,那么就需要 @Execute(phase = LifecyclePhase.COMPILE)
5 ,上传你的插件到自己的私服后,在设置maven的仓库为自己私服后,就可以下载使用自己插件了
相关文章推荐
- 开发自己的Maven插件之一:hello world
- 开发自己的Maven插件之八:使用jslint4java-report plugin
- 开发自己的Maven插件之四:基本概念
- 开发自己的Maven插件之二:利用创建向导简化工作
- 开发自己的Maven插件之五:创建简单的report plugin
- 开发自己的Maven插件之三:使用插件
- 开发自己的Maven插件之六:使用自己的report-plugin
- 开发自己的Maven插件之七:开发jslint4java-report plugin
- 开发自己的带参数的jQuery插件
- 构建自己的C/C++插件开发框架(三)——总体结构
- 构建自己的C/C++插件开发框架(四)——核心层设计和实现
- maven插件开发
- Maven 插件开发
- 今天没事,看到一个用C#开发OutLook插件的例子,顺便自己做了一个
- 构建自己的C/C++插件开发框架
- Eclipse插件开发时创建自己工程后实现刷新透视图
- jquery:如何开发自己的jQuery插件
- 利用jQuery开发适合自己的插件
- 构建自己的C/C++插件开发框架
- php 网站添加视频,如何实现这种效果,自己开发,还是找视频插件商买