`
towne
  • 浏览: 37515 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论
  • mapeijie888: 谢谢 能不能把  此文相关的代码发至邮箱  mapeijie8 ...
    mock测试
  • towne: 如Calendar,Date等类型则需要用户自己实现Conve ...
    XStream
  • jinkingmanager: 讲的挺好,不过我有些问题想问一下: 1 如果一个XML中对应有 ...
    XStream
  • towne: 在web项目中测试servlet比较麻烦,像servletRe ...
    mock测试

Maven2插件开发详解

阅读更多
这样一个话题自然就摆在了我们的面前,那就是Maven2的插件开发。
 
 
说道Maven2就不得不说说Maven2主要部分的标准路径结构(如下图)。

<sourceDirectory>src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>src/test/java</testSurceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>

 
 
AntMaven2 plug-in开发
 
Maven的一个很明显有别与Ant的优势就是在于明确了工程中所用资源包的版本信息,目前我们在工程开发过程中都不免需要用到大量的免费开源的第三方插件,而这些插件在升级过程中的向前兼容做的有时候确实不太理想,就想Hibernate在升级到3.0后包结构的变化一样,让很多开发人员在刚开始使用时都是一头雾水,但是由于Maven2可以明确指明所使用的资源包版本信息,这样就避免了工程中由于资源包版本混乱导致程序崩溃的问题。
 
Ant脚本的plug-in开发需要在POM中声明两个资源包,一个是在编译打包生成plug-in的jar文件时所需要用到的资源包,一个是在plug-in在被执行时,运行Ant脚本所需要的资源包。具体POM的配置如下所示:

<project>
      <modelVersion>4.0.0</modelVersion>
         <groupId>org.myproject.plugins</groupId>
         <artifactId>hello-plugin</artifactId>
         <version>1.0-SNAPSHOT</version>
         <packaging>maven-plugin</packaging>
         <name>Hello Plugin</name>
         <dependencies>
                   <dependency>
                            <groupId>org.apache.maven</groupId>
                            <artifactId>maven-script-ant</artifactId>
                            <version>2.0.1</version>
                   </dependency>
         </dependencies>
         <build>
                   <plugins>
                            <plugin>
                                     <artifactId>maven-plugin-plugin</artifactId>
                                     <dependencies>
                                               <dependency>
                                                        <groupId>org.apache.maven</groupId>
                                                        <artifactId>maven-plugin-tools-ant</artifactId>
                                                        <version>2.0.1</version>
                                               </dependency>
                                     </dependencies>
                                     <configuration>
                                               <goalPrefix>hello</goalPrefix>
                                     </configuration>
                            </plugin>
                   </plugins>
         </build>
</project>

 
 
可以看出我这里并没有对Maven2的路径做任何显示的声明。根据Maven2的标准路径,我们需要将plug-in工程中的脚本文件放在src/main/scripts路径下去。所以,首先在工程中建立这样一个目录,然后在目录中开始编写Ant脚本(hello.build.xml):

<project>
         <target name="hello">
                   <echo>ANT SCRIPT ECHOS:Hello, World</echo>
         </target>
</project>

 
 
接下来编写MOJO脚本(hello.mojos.xml),MOJO是Ant脚本执行的关键,我们也需要将其与Ant脚本放置在同一个目录src/main/scripts下,在该文件中定义Maven2的goal和需要执行的Ant脚本中target名称。具体内容如下:

<pluginMetadata>
         <mojos>
                   <mojo>
                            <goal>hello</goal>
                            <call>hello</call>
                            <description>Say Hello, World.</description>
                   </mojo>
         </mojos>
</pluginMetadata>

 
 
至此,一个完整的基于Maven2的Ant plug-in就已经开发完毕。为了方便举例,我在这里的Ant脚本写得相当简单,你可以在这里根据你的工程具体需求尽情发挥。
 
 
 
接下来执行一下“mvn install”,提示内容如下则说明已经成功发布到了本地仓库中:

D:\eclipse\workspace\hello-plugin>mvn install -e -o
+ Error stacktraces are turned on.
[INFO]
NOTE: Maven is executing in offline mode. Any artifacts not already in your local
repository will be inaccessible.
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Building Hello Plugin
[INFO]    task-segment: [install]
[INFO] ----------------------------------------------------------------------------
[INFO] [plugin:descriptor]
[WARNING] Goal prefix is: hello; Maven currently expects it to be hello
[INFO] Using 3 extractors.
[INFO] Applying extractor for language: java
[INFO] Extractor for language: java found 1 mojo descriptors.
[INFO] Applying extractor for language: bsh
[INFO] Extractor for language: bsh found 0 mojo descriptors.
[INFO] Applying extractor for language: ant
[INFO] Extractor for language: ant found 1 mojo descriptors.
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] No sources to compile
[INFO] [surefire:test]
[INFO] No tests to run.
[INFO] [jar:jar]
[INFO] Building jar: D:\eclipse\workspace\hello-plugin\target\hello-plugin-1.0-S
NAPSHOT.jar
[INFO] [plugin:addPluginArtifactMetadata]
[INFO] [install:install]
[INFO] Installing D:\eclipse\workspace\hello-plugin\target\hello-plugin-1.0-SNAP
SHOT.jar to E:\maven-2.0.4\.m2\repository\org\myproject\plugins\hello-plugin\1.0
-SNAPSHOT\hello-plugin-1.0-SNAPSHOT.jar
[INFO] [plugin:updateRegistry]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Thu Jun 28 10:39:02 CST 2007
[INFO] Final Memory: 9M/17M
[INFO] ------------------------------------------------------------------------
 
D:\eclipse\workspace\hello-plugin>

 
 
接下来就可以在你的工程中将该插件集成上去了,具体做法为将如下代码加入你工程的POM中:
 

<build>
         <plugins>
                   <plugin>
                            <groupId>org.myproject.plugins</groupId>
                            <artifactId>hello-plugin</artifactId>
                            <version>1.0-SNAPSHOT</version>
                   </plugin>
         </plugins>
</build>

 
当然,Maven2对于Ant脚本的支持也并不是仅仅只到了插件级,你还可以在POM中直接使用Ant脚本来完成一些任务。为了保证本篇文章的完整性,关于这个专题我打算再开一篇文章专门说明。
 
 
 
JavaMaven2 plug-in开发
 
在已经建立的Ant plug-in工程中引入代码如下(对与Struts程序员来说,是不是有点似曾相识的感觉!):

package org.danlley.com;
 
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
 
/**
 * Says "Hi" to the user.
 * @goal sayhi
 */
public class GreetingMojo extends AbstractMojo
{
    public void execute() throws MojoExecutionException
    {
        getLog().info("-------------------------------------------");
        getLog().info("|              Hello, world.               |");
        getLog().info("-------------------------------------------");
    }
}

 
其中AbstractMojo和MojoExecutionException都是Maven2核心支持包中的类,你可以在Maven2安装路径的lib目录下找到maven-core-2.0.6-uber.jar(我用的是version2.0.6,不过现在我在官方网站看到2.0.7也已经出来了)
重新编译,重新install。然后新建工程,以便测试插件是否能够正常工作。
新工程的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>org.danlley.com</groupId>
         <artifactId>mvnproj</artifactId>
         <packaging>jar</packaging>
         <version>1.0-SNAPSHOT</version>
         <name>mvnproj</name>
         <url>http://maven.apache.org</url>
         <build>
                   <plugins>
                   <plugin>
                            <groupId>org.myproject.plugins</groupId>
                            <artifactId>hello-plugin</artifactId>
                            <version>1.0-SNAPSHOT</version>
                   </plugin>
                   </plugins>
         </build>
         <dependencies>
                   <dependency>
                            <groupId>org.apache.ant</groupId>
                            <artifactId>ant</artifactId>
                            <version>1.7.0</version>
                   </dependency>
                   <dependency>
                            <groupId>junit</groupId>
                            <artifactId>junit</artifactId>
                            <version>3.8.1</version>
                            <scope>test</scope>
                   </dependency>
         </dependencies>
</project>

 
 
执行命令,运行结果如下则说明插件开发成功!

E:\myproj\mvnproj>mvn package hello:hello hello:sayhi -e -o
+ Error stacktraces are turned on.
[INFO]NOTE: Maven is executing in offline mode. Any artifacts not already in your local
repository will be inaccessible.
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'hello'.
[INFO] ----------------------------------------------------------------------------
[INFO] Building mvnproj
[INFO]    task-segment: [package]
[INFO] ----------------------------------------------------------------------------
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test]
[INFO] Surefire report directory: E:\myproj\mvnproj\target\surefire-reports
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.danlley.com.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.047 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] [jar:jar]
[INFO] Building jar: E:\myproj\mvnproj\target\mvnproj-1.0-SNAPSHOT.jar
[INFO] ----------------------------------------------------------------------------
[INFO] Building mvnproj
[INFO]    task-segment: [hello:hello] (aggregator-style)
[INFO] ----------------------------------------------------------------------------
[INFO] [hello:hello]
hello:
     [echo] ANT SCRIPT ECHOS:Hello, World
[INFO] ----------------------------------------------------------------------------
[INFO] Building mvnproj
[INFO]    task-segment: [hello:sayhi]
[INFO] ----------------------------------------------------------------------------
[INFO] [hello:sayhi]
[INFO] -------------------------------------------
[INFO] |              Hello, world.               |
[INFO] -------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Thu Jun 28 12:58:51 CST 2007
[INFO] Final Memory: 5M/10M
[INFO] ------------------------------------------------------------------------

分享到:
评论

相关推荐

    eclipse怎么安装maven开发插件

    该文档主要讲述maven插件安装过程与详解

    maven的pom.xml说明详解

    -工程组号- -通用前置接口号- -版本号- -打包文件前置.xml- -全局属性配置- -NJCC开发环境(MySQL)- -部署环境(对应配置文件版本)- -设置默认环境- -NJCC开发环境(Oracle)- -部署环境(对应配置文件版本...-打包插件-

    Maven权威指南 很精典的学习教程,比ANT更好用

    基于Maven插件的全局性重用 1.5. 一个“项目”的概念模型 1.6. Maven是Ant的另一种选择么? 1.7. 比较Maven和Ant 1.8. 总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven ...

    maven的安装和配置

    Apache Maven是一个很流行的软件项目管理和理解工具,它能够被用来构建和管理任何基于java的项目,主要有以下...2、maven配置文件详解 2.1、localRepository配置 2.2、servers配置 2.3、mirrors配置 2.4、profiles配置

    shacl-plugin:SHACL4Protege-适用于Protégé的SHACL约束验证插件

    SHACL4Protege v1.0.0 适用于Protégé... 该插件使用TopBraid SHACL Engine 1.3.1 [2]和Apache Jena 3.14.0 [3]开发。 该插件由TU维也纳的Lin Xiashuo Lin( @xlin )和Fajar Ekaputra( @fekaputra )开发。 后来

    jTester使用指南(带书签).pdf

    《jTester使用指南》jTester 写单元测试的开发文档,作者吴大瑞,pdf 格式,大小 1.1MB。本书带有 pdf 书签,方便读者阅读。 目录: jTester使用指南 目录 第 1 章 安装jtester maven用户安装 ant用户安装 安装...

    Spring Cloud中使用jib进行docker部署的步骤详解

    Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。 通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快速而简单的容器镜像构建...

    全新JAVAEE大神完美就业实战课程 超150G巨制课程轻松实战JAVAEE课程 就业部分.txt

    11-Maven(学习2天) Maven_day01._Maven安装.Maven整合SSH Maven_day02.Maven整合SSH.私服安装配置 12-SSH企业案例2_ERP_项目整合(学习15天) ERP_day01_ERP简介,软件设局.环境搭建.部门管理列表查询 ERP_day02...

    Spring Boot 2.4 新特性之一键构建Docker镜像的过程详解

    在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,...

    自动生成代码工具配置文件及技术点详解

    springboot、mysql、模板引擎工具、maven相关、阿里巴巴数据库连接池、orm-mybatis、json相关技能点、html、css、js。 通过以上所阐述技能点,完全能工读懂代码,再次基础上完成二次开发,实现自己的代码生成器。 ...

    2024年IDEA新手使用教程:详解,让你轻松上手!

    内容涵盖IDEA的下载安装、创建新项目、编写和运行代码、使用版本控制、使用Maven或Gradle、配置数据库、调试代码、使用插件、使用Terminal、使用Live Templates、代码自动完成、代码重构、代码片段、性能监控、云端...

    JBPM4工作流应用开始指南.rar

    第一篇 jBPM工作流开发基础 1 第1章 工作流基础 2 1.1 工作流概念 2 1.1.1 工作流管理思想之于企业现代化管理 2 1.1.2 工作流技术在企业中的应用 5 1.1.3 如何从一个开发者的角度看工作流技术 6 1.2 工作流管理系统...

    webx3框架指南PDF教程附学习Demo

    第 2 章 SpringExt ................................................................................................... 10 2.1. 用SpringExt装配服务 .....................................................

Global site tag (gtag.js) - Google Analytics