`
towne
  • 浏览: 38090 次
  • 性别: 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插件包)

    Eclipse作为流行的Java集成开发环境,为了方便开发者使用Maven,提供了Maven插件。本篇文章将详细解析如何在Eclipse中离线安装Maven插件,同时提供内附的Maven插件包,以解决在线安装过程中的速度问题和可能遇到的...

    maven仓库插件

    Maven插件是Maven生命周期中的执行单元,它们执行特定的任务,如编译源代码、打包项目、运行测试等。Maven仓库插件则是专门用于处理仓库操作的插件,包括下载依赖、上传构建的工件以及管理仓库配置。 ** Maven仓库...

    m2maven是maven管理插件

    在提供的压缩包文件名称"0.10.2.20100623-1649"中,我们可以推测这是m2maven插件的一个特定版本,发布于2010年6月23日,具体版本号可能是0.10.2,这表明m2maven插件在较早的时候就已经存在,并且持续更新以适应不断...

    IDEA Maven Helper插件

    **IDEA Maven Helper插件详解** IDEA Maven Helper是一款针对IntelliJ IDEA(简称IDEA)开发的强大插件,它极大地简化了Maven项目的工作流程,帮助开发者更好地理解和管理Maven依赖关系。这款插件源自于对高效开发...

    maven插件压缩包

    ** Maven 插件压缩包详解 ** Maven 是一个强大的项目管理工具,广泛应用于Java开发领域,它通过一套规范化的构建过程,使得项目的构建、依赖管理和部署变得更加简单。Maven 插件是 Maven 生态系统的重要组成部分,...

    Maven Tomcat 插件

    ### Maven Tomcat 插件详解 #### 一、引言 在现代软件开发过程中,持续集成与部署(CI/CD)已成为提升开发效率的关键技术之一。对于Java Web开发者而言,如何快速有效地将Web应用程序部署到Tomcat服务器上,是提高...

    Myeclipse6.5的Maven插件

    **MyEclipse 6.5 Maven插件详解** 在软件开发过程中,MyEclipse作为一款强大的Java集成开发环境,提供了对多种技术的支持,包括但不限于Java、JSP、Servlet、Struts、Spring等。而在Java企业级开发中,Maven作为...

    Eclipse安装Maven插件

    ### Eclipse安装Maven插件详解 #### 一、前言 在Java开发领域,Eclipse作为一款广受欢迎的集成开发环境(IDE),提供了强大的编辑、调试及构建功能。Maven作为一个自动化构建工具,能帮助开发者简化项目管理流程,...

    maven helper idea 插件

    **Maven Helper IDEA 插件详解** Maven Helper是一款针对IntelliJ IDEA(简称Idea)开发的强大插件,主要用于优化Maven项目管理和构建过程。它提供了多种实用功能,帮助开发者更高效地处理Maven依赖关系,排查冲突...

    maven的myeclipse插件

    为了在MyEclipse中使用Maven的功能,我们需要集成Maven插件,这里提到的就是`m2eclipse`。 ** 描述详解 ** 将Maven集成到MyEclipse中并不复杂,主要步骤如下: 1. **安装m2eclipse插件**:首先,你需要确保你的...

    maven插件

    ** Maven插件详解 ** Maven,作为Java项目管理和构建工具,通过定义一套标准的项目结构和生命周期,简化了项目的构建、依赖管理以及文档生成。其中,Maven插件是其核心组成部分,它负责执行特定的构建任务。本文将...

    Maven安装与MyElipse8.5安装Maven插件

    3. **卸载MyEclipse内置Maven插件**:首先需要进入Help -&gt; MyEclipse Configuration Center -&gt; Software,找到MavenSupport for MyEclipse插件并选择remove,然后点击应用按钮执行更新操作。 4. **添加m2e插件**:...

    maven离线插件

    这个步骤将使Eclipse识别并使用这些离线的Maven插件和依赖。 3. **配置Eclipse**:在Eclipse中,你需要配置Maven的设置以指向新添加的本地插件库。进入`Window &gt; Preferences &gt; Maven &gt; User Settings`,更新`...

    使用Maven搭建S2SH工程详解一:使用Maven创建struts2工程

    【使用Maven搭建S2SH工程详解一:创建Struts2工程】 在Java Web开发中,S2SH架构(Struts2 + Spring + Hibernate)是一种常见的应用框架组合,用于构建高效、灵活的企业级应用程序。本篇文章主要讲解如何利用Maven...

    maven插件用来分布式集成开发的

    **一、Maven插件详解** Maven插件是Maven生态系统的关键组成部分,它们提供了一系列的目标(goals),这些目标可以执行特定的构建任务,如编译源代码、打包、测试、部署等。Maven通过插件系统来扩展其功能,使得...

    m2eclipse maven插件

    **m2eclipse Maven插件详解** m2eclipse(Maven Integration for Eclipse)是Eclipse集成开发环境(IDE)中的一个插件,用于支持Apache Maven项目管理工具。这款插件使得Eclipse用户可以直接在IDE内管理和构建Maven...

Global site tag (gtag.js) - Google Analytics