- 浏览: 364696 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
jiangli19192:
...
自己写的一个启动JBoss服务器的bat批处理 -
56553655:
最好这样:java -Xms3700M -Xmx3700M - ...
测试本机JVM支持的最大内存 -
lizhiy05:
学习一哈……
Web Services体系结构及相关概念 -
ghy200692162:
System.out.println("开始注册Js ...
基于OSGi的JSF Web组件开发问题求解 -
xiao888lin:
你的头像看起来很像我们宿舍老四。。。
测试本机JVM支持的最大内存
在Maven2强大功能的魅力诱惑下,很多公司渐渐开始从Ant转向了Maven2,而且由于Maven2本来就支持运行Ant脚本,这样就大大降低了开发团队在从Ant向Maven2过渡所需难度。
相对于Ant对开发人员的相对开放的姿态,Maven2对开发人员来说看起来比较透明。很多对以前老的Ant程序员来说需要编写target的问题在Maven2中都变成了一些简单的配置。理论上讲,这样一来,Maven2的使用起点应该是比Ant低多了,因为在Ant中程序员至少应该熟悉Velocity语法才行。但是由于Maven2到目前为止还没有成套系统的中文资料或文档可供查看,使得Maven2的使用看起来并不比Ant简单多少。反倒是由于什么东西都需要进行配置,但手头又没有相关的说明文档,是很多开发人员在刚开始使用Maven2时有些无从下手的感觉。更让人痛苦的是网上很多关于Maven的资料都是针对1.0版本的,更可恨的是很多资料明明是基于1.0版本写的,可是我们的作者只是换换标题和其中的几个关键字信息就堂而皇之的将其作为2.0的资料贴在自己的博客中(极其不负责任)。
前面这一段是废话,仅仅是为了将大家引入我下面的话题,在使用Maven进行工程管理的过程中,我们可能希望将现有的Ant脚本集成到我们的POM中,我们甚至希望在POM中不出现Ant脚本的情况下将以前已经写好并使用了很长一段时间的工程脚本集成到我们现有的Maven工程当中。同时,或者现有的Maven无法支持我们需要完成的一些特殊任务。
这样一个话题自然就摆在了我们的面前,那就是Maven2的插件开发。
说道Maven2就不得不说说Maven2主要部分的标准路径结构(如下图)。
xml 代码
<sourceDirectory>src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>src/test/java</testSurceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
这些路径是Maven2配置的基础(还有些其他路径,不再详述),
通常情况下,我们没必要显式声明路径结构。除非我们要改变其标准路径结构时,可以通过配置以上参数来进行个性化配置。但是Maven2的官方网站强烈建议使用Maven的标准路径。而且Maven官方提供的某些插件也只仅仅支持到了标准路径,对于非标准路径这些配置不起任何作用(如Cobertura1.8的plug-in)。
(Maven2官方提供的Cobertura1.8的plug-in有些Bug,无法正确生成最后的Coverage Test Reporting。关于这个问题的解决我打算重开一个专题,以便今后查阅。)
因此,我在本篇文章中介绍的插件开发也采用Maven2的标准路径。先说说Ant plug-in的开发,然后在介绍用Java进行plug-in 开发。
Ant的Maven2 plug-in开发
Maven的一个很明显有别与Ant的优势就是在于明确了工程中所用资源包的版本信息,目前我们在工程开发过程中都不免需要用到大量的免费开源的第三方插件,而这些插件在升级过程中的向前兼容做的有时候确实不太理想,就想Hibernate在升级到3.0后包结构的变化一样,让很多开发人员在刚开始使用时都是一头雾水,但是由于Maven2可以明确指明所使用的资源包版本信息,这样就避免了工程中由于资源包版本混乱导致程序崩溃的问题。
Ant脚本的plug-in开发需要在POM中声明两个资源包,一个是在编译打包生成plug-in的jar文件时所需要用到的资源包,一个是在plug-in在被执行时,运行Ant脚本所需要的资源包。具体POM的配置如下所示:
xml 代码
<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):
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名称。具体内容如下:
xml 代码
<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中:
xml 代码
<build>
<plugins>
<plugin>
<groupId>org.myproject.plugins</groupId>
<artifactId>hello-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>
当然,Maven2对于Ant脚本的支持也并不是仅仅只到了插件级,你还可以在POM中直接使用Ant脚本来完成一些任务。为了保证本篇文章的完整性,关于这个专题我打算再开一篇文章专门说明。
Java的Maven2 plug-in开发
在已经建立的Ant plug-in工程中引入代码如下(对与Struts程序员来说,是不是有点似曾相识的感觉!):
java 代码
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如下:
xml 代码
<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] ------------------------------------------------------------------------
评论
2 楼
Willam2004
2010-06-22
lz要是能将整个建工程的步骤写下来,是不是会更清楚些?
比如如何创建mvn plugin工程?
比如如何创建mvn plugin工程?
1 楼
VSandJava
2007-10-04
好文章应该支持一下!
发表评论
-
GIT使用批处理完成日常代码管理
2017-03-26 22:01 1225本文默认读者的本机是已经安装好了GIT本地端,因此对于GI ... -
在Maven2插件中用Velocity对配置文件的集中管理
2007-08-06 16:55 2346正如我在“用Velocity进行配置文件信息的集中管理 ”—— ... -
用Velocity进行配置文件信息的集中管理
2007-07-27 16:02 4563Apache从他诞生的那天起 ... -
测试驱动开发与EasyMock的使用
2007-07-17 22:19 1879测试驱动开发并不是什 ... -
在工程POM中内嵌Ant脚本
2007-07-17 22:14 1726由于每篇文章的字数有限制,我没办法在同一个专题中同时将相关的问 ... -
用Emma的Eclipse插件进行代码覆盖率测试
2007-07-17 22:00 6852如上一个关于Cobertura的专题所说,我这里单开一个专题来 ... -
用Cobertura在Maven命令行进行覆盖测试
2007-07-17 21:58 8990Cobertura是一个基于jcovera ... -
ant中使用cobertura分析测试用例的代码覆盖率
2007-07-17 21:48 4531这次还是配置问题,接上上次关于ant脚本模板的详细说明。对于一 ... -
我写的ant编译、打包、测试、测试报告生成和邮件发送模板
2007-07-17 21:40 4912js 代码 <?xml ve ... -
XFire使用举例
2007-07-17 21:32 2374闲来无事,顺便写个XFire的小例子,也算是打发时间了,o( ... -
Maven入门--较复杂的实例
2007-07-17 21:19 1600本文将使用一个较复杂的实例,讲述如何定制目录布局(即不使用M ... -
Maven入门--概念与实例
2007-07-17 21:15 1294Maven入门--概念与实例 最近由于工作原因在研 ... -
设计模式总结
2007-07-17 17:14 628设计模式 1) 控制倒置模式: 说到控制倒置模式,就不得不 ... -
Eclipse中常用快捷键总结
2007-07-17 16:57 1139Eclipse中常用快捷键总结: CTRL+SHI ... -
修改eclipse中的默认maven2资源仓库保存地址
2007-07-17 16:56 5808当你在eclipse中集成了maven2后,默认情况下,ecl ... -
用ant进行工程管理
2007-07-17 13:50 21001.典型地,一个ant工程脚本如下: < ... -
利用maven2为工程的jar文件内部打入版本信息
2007-07-17 13:42 17171.修改pom.xml文件,在proj ... -
比ant更强大的工具maven2之自动生成工程
2007-07-17 13:38 2920maven2是在ant的基础上发展起来的,并对ant的功能进行 ... -
OFBIZ开源电子商务学习心得
2007-07-17 13:36 2520看懂在APACHE网站上的英文文档确实是一项不小的挑战,下面说 ... -
开始每个模块功能编写时需要做的事情总结
2007-07-17 13:20 10841.对查询出的展示列表进行排序 2.检查SQL语句,并思 ...
相关推荐
该文档主要讲述maven插件安装过程与详解
-工程组号- -通用前置接口号- -版本号- -打包文件前置.xml- -全局属性配置- -NJCC开发环境(MySQL)- -部署环境(对应配置文件版本)- -设置默认环境- -NJCC开发环境(Oracle)- -部署环境(对应配置文件版本...-打包插件-
基于Maven插件的全局性重用 1.5. 一个“项目”的概念模型 1.6. Maven是Ant的另一种选择么? 1.7. 比较Maven和Ant 1.8. 总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven ...
Apache Maven是一个很流行的软件项目管理和理解工具,它能够被用来构建和管理任何基于java的项目,主要有以下...2、maven配置文件详解 2.1、localRepository配置 2.2、servers配置 2.3、mirrors配置 2.4、profiles配置
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使用指南》jTester 写单元测试的开发文档,作者吴大瑞,pdf 格式,大小 1.1MB。本书带有 pdf 书签,方便读者阅读。 目录: jTester使用指南 目录 第 1 章 安装jtester maven用户安装 ant用户安装 安装...
Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。 通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快速而简单的容器镜像构建...
11-Maven(学习2天) Maven_day01._Maven安装.Maven整合SSH Maven_day02.Maven整合SSH.私服安装配置 12-SSH企业案例2_ERP_项目整合(学习15天) ERP_day01_ERP简介,软件设局.环境搭建.部门管理列表查询 ERP_day02...
在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,...
springboot、mysql、模板引擎工具、maven相关、阿里巴巴数据库连接池、orm-mybatis、json相关技能点、html、css、js。 通过以上所阐述技能点,完全能工读懂代码,再次基础上完成二次开发,实现自己的代码生成器。 ...
内容涵盖IDEA的下载安装、创建新项目、编写和运行代码、使用版本控制、使用Maven或Gradle、配置数据库、调试代码、使用插件、使用Terminal、使用Live Templates、代码自动完成、代码重构、代码片段、性能监控、云端...
第一篇 jBPM工作流开发基础 1 第1章 工作流基础 2 1.1 工作流概念 2 1.1.1 工作流管理思想之于企业现代化管理 2 1.1.2 工作流技术在企业中的应用 5 1.1.3 如何从一个开发者的角度看工作流技术 6 1.2 工作流管理系统...
第 2 章 SpringExt ................................................................................................... 10 2.1. 用SpringExt装配服务 .....................................................