如何编写一个Maven插件

如何编写一个Maven插件,第1张

基础

当maven内置的功能不能满足需求的时候怎么办,那就只能给它写插件了。 (话说回来,给maven扩展只能写一个很完整的插件,而不能是一个简单的script,真的是太笨重了)

网络上很多maven的文章,但基本很少谈及如何给它写插件,即使你搜索maven plugin,也只是给你返回一堆如何使用maven插件的文章。希望这边文章能给一些maven使用者带来帮助。

我在这里先假设你已经懂得使用maven,我不会贴出完整的pomxml文件

首先,你需要创建一个maven项目,插件是一种特殊的maven项目 然后修改pomxml,将packaging改为maven-plugin

<packaging>maven-plugin</packaging>

通过properties定义maven的版本

<properties>
<mavenversion>221</mavenversion>
</properties>

maven3已经出了很久,并且兼容maven2,因此我们团队内部都是统一使用maven3,但是我这里编写插件使用的是maven2,可以同时在maven2和maven3下使用,不过其实这个原因并不重要,真正的原因是因为maven3的代码实在太烂了,最初的时候我用maven3的api lib来写,发现里面很多代码根本没有注释,而且很多代码已经废弃,但是并没有明确说明究竟用什么方法代替。最后我使用了maven2中被maven3废弃的api来完成我的功能,跑的挺好的,就是有时可能会有一些使用准备废弃的api的提醒而已。

接着添加依赖

<dependencies>
<dependency>
  <groupid>orgapachemaven</groupid>
  <artifactid>maven-plugin-api</artifactid>
  <version>${mavenversion}</version>
</dependency>
<dependency>
  <groupid>orgapachemaven</groupid>
  <artifactid>maven-core</artifactid>
  <version>${mavenversion}</version>
</dependency>
</dependencies>

然后开始创建Mojo类,maven插件里面每一个具体的功能都是一个Mojo 比如说eclipse:clean和eclipse:eclipse就是两个Mojo

/
 @goal helloWorld
/
public class HelloWorldMojo extends AbstractMojo {
  public void execute() throws MojoExecutionException
  {
      getLog()info("Hello, world!");
  }
}

首先继承AbstractMojo,并且实现execute()方法,这个就是每次调用进入的地方 然后需要在类的Javadoc上定义,这是一个annotation出来之前常用的定义方法(或许未来maven会将它改成annotation,那就能提供编译校验和IDE校验)。我们必须定义@goal,代表运行目标,简单来说就是eclipse:clean中的clean Mojo写在哪个package底下都是可以的

这样,我们就完成了一个简单的maven plugin,然后我们需要一个简单的测试来确定他正确运行 先通过maven install将它安装到本地仓库

然后打开任意maven的项目(比如说我们原来已经在用maven的项目),在pomxml增加一个plugin

<build>
  <plugins>
    <plugin>
      <groupid>xxx</groupid>
      <artifactid>xxx</artifactid>
      <version>xxx</version>
      <executions>
        <execution>
          <phase>compile</phase>
          <goals>
            <goal>helloWorld</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

需要留意的是phase部分,我们将这个plugin绑定到compile这个周期 然后我们运行mvn compile,就能成功看见Hello, world!输出 (当然你也可以直接通过命令行运行,需要带上完整的groupId和artifactId才能调用)

注入

Mojo是一个很简单的Java Bean模式的类,你会发现Mojo所继承的AbstractMojo里面之后非常少的方法。那我们需要在Mojoexecute里面获取当前运行中的上下文如何处理呢?答案是注入,就是跟spring ioc差不多的注入方式。

常用的注入主要有两种,第一种是xml配置中的额外设置 比如说我们有这么一个plugin的配置

<plugin>
<artifactid>maven-eclipse-plugin</artifactid>
<configuration>
<downloadsources>true</downloadsources>
</configuration>
</plugin>

所有写在configuration里面的属性都可以注入到Mojo中,比如说以下代码

/
  @parameter
 /
private boolean downloadSources;

就可以通过downloadSources变量获得配置中的值 值得注意的是,这里是不用生成完整的JavaBean模式的get/set的,并且private是有效的

javadoc里面还可以加入其他属性,比如说

/
  @parameter default-value="true"
  @readonly
 /
private boolean downloadSources;

就是默认为true,并且不能通过配置修改(当然我们这里肯定不会有这样的需求) 更多的javadoc可以参看官方文档中的说明

第二种注入的数据就是上下文,跟>/
  @parameter expression="${project}"
  @readonly
 /
private MavenProject project;
/
  @component
  @readonly
 /
private ArtifactFactory artifactFactory;

例如这里我们就能获得ArtifactFactory和MavenProject 需要注意的是这里可能有两种方法,第一种跟xml配置获得的方法差不多,通过expression指定名字 实际上,你在xml里面,也可以通过${project}获得相应的东西进行一些简单的 *** 作(当然xml里面只能文本描述,这里是一个类)

另外一种就是使用@component这个标注,可以获得一些基本的组件实例。

测试

写完一个插件之后,我们就需要对他进行测试 如果我们用人工测试的话,将会非常麻烦,因为maven插件本身的发布流程就非常复杂 你需要编译打包你的maven插件,然后安装到本地库(或远程私库中),然后写一个sample project,再运行,看一下是否正确 当然你也可以用单元测试来解决一些问题,但是单元测试比较难保证插件最终正确,而且maven插件很经常是跟文件打交道

这里我们就需要对maven插件进行自动化的集成测试 maven的生命周期是包含集成测试的,默认是没有绑定任何功能。不过如果你google一下,会找到一些maven进行集成测试的例子,大致就是启动jetty,然后通过>

我们这里使用的是maven-invoker-plugin,它就是用于maven插件的集成测试

先在pomxml中加入

<build>
<plugins>
<plugin>
<artifactid>maven-invoker-plugin</artifactid>
<configuration>
<cloneprojectsto>${projectbuilddirectory}/it</cloneprojectsto>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>install</goal>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

cloneProjectsTo是先将测试案例拷贝出来再运行 execution段的设定是把maven-invoker-plugin的两个goal绑定到integration-test上 integration-test这个生命周期会在mvn install之前调用

集成测试的内容放在 src/it 目录下,每新建一个目录代表一个独立的测试,里面放一个完整的maven项目,当然你在这个项目里面需要引入自己编写的maven插件并且运行 另外还需要一个postbuildgroovy文件,放在测试案例的根目录,这个脚本的用处是检查运行后的maven项目是否达到自己要的效果。很明显,看名字就知道用groovy来写,一般我们会检查一下,是否产生了某某文件等等来判定,如果不正确的话抛出异常

然后我们在maven插件目录运行mvn integration-test就能进行集成测试了

maven 编译命令
从别处拷贝来的maven项目,有时候会出现不能debug关联的情况,即按住ctrl键后不能跳转到相应的类或方法,这是需要eclipse环境生成 Eclipse 项目文件的。
可以在cmd命令窗口下进入到maven项目包含pomxml文件的目录下,运行 mvn eclipse:eclipse 命令即可,如果还不行,可使用mvn compile :编译源代码 命令。
--------------------------------------------------------------------------------------------------------------------------------
下面是一些maven的常用命令:
Maven2 的运行命令为 : mvn ,
常用命令为 :
mvn archetype:create :创建 Maven 项目
mvn compile :编译源代码
mvn test-compile :编译测试代码
mvn test : 运行应用程序中的单元测试
mvn site : 生成项目相关信息的网站
mvn clean :清除目标目录中的生成结果
mvn package : 依据项目生成 jar 文件
mvn install :在本地 Repository 中安装 jar
mvn eclipse:eclipse :生成 Eclipse 项目文件
生成项目
建一个 JAVA 项目 : mvn archetype:create -DgroupId=comdemo -DartifactId=App
建一个 web 项目 : mvn archetype:create -DgroupId=comdemo -DartifactId=web-app -DarchetypeArtifactId=maven-archetype-webapp
生成 Eclipse 项目
普通 Eclipse 项目执行 : mvn eclipse:eclipse
Eclipse WTP 项目执行 : mvn eclipse:eclipse –Dwtpversion=10
更详细的,自己百度搜索 maven 编译,学习一下吧

maven是一个项目构建和管理的工具,提供了帮助管理构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性。

最近碰到了一些特殊的问题,有些test case在IDE里面运行是可以pass的,但通过Maven运行就一定会出问题。这里不深入讨论,这类测试一般都是和entity manager有关的。今天记录一下在这过程中,maven的一些测试特性:如何用Maven运行特定的test case。
运行一个单独的test
在开发过程中,你有可能需要重复的单独运行一个test class。要用mavan做到这个,需要把test属性设为你想要的test class的名字。(不需要后缀名,如果不小心添加了,也会被mvn去掉)
mvn -Dtest=TestCircle test
1
如果你pomxml里面的surefile plugin配置了多个测试层级,有可能你只想执行默认的测试层级:
mvn surefire:test -Dtest=TestCircle
1
你还可以用表达式来运行一组测试:
mvn -Dtest=TestCile test
1
或者用多个名字/模式,只需要用逗号把他们分开:
mvn -Dtest=TestSquare,TestCile test
1
运行单个test class中的一组测试
在maven-surefire-plugin的273之后, 你可以运行单个test class中的特定test,语法如下:
(NOTE : 这个功能只能支持Junit 4x和TestNG)
mvn -Dtest=TestCircle#mytest test
1
当然还是可以用模式:
mvn -Dtest=TestCircle#test test
1
在Surefire Plugin 219之后,你还可以这样写:(JUnit 4, JUnit 47+ 以及 TestNG):
mvn -Dtest=TestCircle#testOne+testTwo test
1
支持多格式的模式
在Surefire Plugin 219之后,你甚至可以在一条模板中用多种格式: (JUnit 4, JUnit 47+, TestNG):
mvn "-Dtest=Test, !Unstable, pkg//CileTestjava, Test#testOne+testTwo, #fast+slowTest" test

Maven中的test横线是指在Maven项目中,test文件夹下的横线,它是用来区分不同的测试类型的,比如单元测试,集成测试,性能测试等。横线的作用是为了让Maven知道哪些文件是测试文件,哪些文件不是测试文件,从而可以更好地管理测试文件。比如,在Maven项目中,test文件夹下的文件以“_test”结尾的文件都会被Maven识别为测试文件,而不以“_test”结尾的文件则不会被Maven识别为测试文件。因此,横线可以帮助Maven更好地管理测试文件,从而提高测试效率。

1首先maven项目要添加JUnit对应的jar包。

打开项目,双击pomxml文件,添加如下代码后保存,然后maven install一下,引入JUnit对应的jar包。

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>411</version>
       </dependency>

2选中你要测试的那个类,右击 new --> other  --> junit test case

3然后点击next ,选中你需要测试的方法,然后finish 就行了,单元测试类创建完成,开始编写测试代码。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13401279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存