maven编译插件
A. maven install与maven build的区别是什么
Maven build 等同于Maven命令;
mvnpackage表示对Maven工程进行打包。
Maven Clean等同于Maven命令;
mvnclean表示删除maven工程的target目录下的内容。
Maven Install等同于命令;
mvninstall表示将jar包发布到本地maven仓库。
首先需要理解maven的生命周期与插件目标这两个概念:
拿Maven clean来说吧。生命周期为clean,插件目标为maven-clean-plugin:clean。
Maven build是这个插件让你自己去配置执行目标的。
Maven clean 清除上一次Maven执行的结果,
Maven generate-sources会根据pom配置去生成源代码格式的包,
Maven install将项目输出构件部署到本地仓库。
不必太过于关注build工作的实现细节。我们只需要使用一些build生命周期短语就可以达到我们的目标,而不必管Maven是如何做到这些的。如:只需要告诉Maven要安装(install),那么它自然就会验证,编译,打包,及安装。
B. 如何编写一个Maven插件
基础
当maven内置的功能不能满足需求的时候怎么办,那就只能给它写插件了。 (话说回来,给maven扩展只能写一个很完整的插件,而不能是一个简单的script,真的是太笨重了)
网络上很多maven的文章,但基本很少谈及如何给它写插件,即使你搜索maven plugin,也只是给你返回一堆如何使用maven插件的文章。希望这边文章能给一些maven使用者带来帮助。
我在这里先假设你已经懂得使用maven,我不会贴出完整的pom.xml文件
首先,你需要创建一个maven项目,插件是一种特殊的maven项目 然后修改pom.xml,将packaging改为maven-plugin
<packaging>maven-plugin</packaging>
通过properties定义maven的版本
<properties>
<maven.version>2.2.1</maven.version>
</properties>
maven3已经出了很久,并且兼容maven2,因此我们团队内部都是统一使用maven3,但是我这里编写插件使用的是maven2,可以同时在maven2和maven3下使用,不过其实这个原因并不重要,真正的原因是因为maven3的代码实在太烂了,最初的时候我用maven3的api lib来写,发现里面很多代码根本没有注释,而且很多代码已经废弃,但是并没有明确说明究竟用什么方法代替。最后我使用了maven2中被maven3废弃的api来完成我的功能,跑的挺好的,就是有时可能会有一些使用准备废弃的api的提醒而已。
接着添加依赖
<dependencies>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-plugin-api</artifactid>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-core</artifactid>
<version>${maven.version}</version>
</dependency>
</dependencies>
然后开始创建Mojo类,maven插件里面每一个具体的功能都是一个Mojo 比如说eclipse:clean和eclipse:eclipse就是两个Mojo
/**
*@goalhelloWorld
*/
{
publicvoidexecute()throwsMojoExecutionException
{
getLog().info("Hello,world!");
}
}
首先继承AbstractMojo,并且实现execute()方法,这个就是每次调用进入的地方 然后需要在类的javadoc上定义,这是一个annotation出来之前常用的定义方法(或许未来maven会将它改成annotation,那就能提供编译校验和IDE校验)。我们必须定义@goal,代表运行目标,简单来说就是eclipse:clean中的clean Mojo写在哪个package底下都是可以的
这样,我们就完成了一个简单的maven plugin,然后我们需要一个简单的测试来确定他正确运行 先通过maven install将它安装到本地仓库
然后打开任意maven的项目(比如说我们原来已经在用maven的项目),在pom.xml增加一个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里面之后非常少的方法。那我们需要在Mojo.execute里面获取当前运行中的上下文如何处理呢?答案是注入,就是跟spring ioc差不多的注入方式。
常用的注入主要有两种,第一种是xml配置中的额外设置 比如说我们有这么一个plugin的配置
<plugin>
<artifactid>maven-eclipse-plugin</artifactid>
<configuration>
<downloadsources>true</downloadsources>
</configuration>
</plugin>
所有写在configuration里面的属性都可以注入到Mojo中,比如说以下代码
/**
*@parameter
*/
privatebooleandownloadSources;
就可以通过downloadSources变量获得配置中的值 值得注意的是,这里是不用生成完整的JavaBean模式的get/set的,并且private是有效的
javadoc里面还可以加入其他属性,比如说
/**
*@parameterdefault-value="true"
*@readonly
*/
privatebooleandownloadSources;
就是默认为true,并且不能通过配置修改(当然我们这里肯定不会有这样的需求) 更多的javadoc可以参看官方文档中的说明
第二种注入的数据就是上下文,跟HttpServlet.getServletContext这种写法不一样,如果我们需要Mojo运行期的上下文,也是通过注入获得的
/**
*@parameterexpression="${project}"
*@readonly
*/
privateMavenProjectproject;
/**
*@component
*@readonly
*/
;
例如这里我们就能获得ArtifactFactory和MavenProject 需要注意的是这里可能有两种方法,第一种跟xml配置获得的方法差不多,通过expression指定名字 实际上,你在xml里面,也可以通过${project}获得相应的东西进行一些简单的操作(当然xml里面只能文本描述,这里是一个类)
另外一种就是使用@component这个标注,可以获得一些基本的组件实例。
测试
写完一个插件之后,我们就需要对他进行测试 如果我们用人工测试的话,将会非常麻烦,因为maven插件本身的发布流程就非常复杂 你需要编译打包你的maven插件,然后安装到本地库(或远程私库中),然后写一个sample project,再运行,看一下是否正确 当然你也可以用单元测试来解决一些问题,但是单元测试比较难保证插件最终正确,而且maven插件很经常是跟文件打交道
这里我们就需要对maven插件进行自动化的集成测试 maven的生命周期是包含集成测试的,默认是没有绑定任何功能。不过如果你google一下,会找到一些maven进行集成测试的例子,大致就是启动jetty,然后通过http访问验证,再关闭jetty
我们这里使用的是maven-invoker-plugin,它就是用于maven插件的集成测试
先在pom.xml中加入
<build>
<plugins>
<plugin>
<artifactid>maven-invoker-plugin</artifactid>
<configuration>
<cloneprojectsto>${project.build.directory}/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插件并且运行 另外还需要一个postbuild.groovy文件,放在测试案例的根目录,这个脚本的用处是检查运行后的maven项目是否达到自己要的效果。很明显,看名字就知道用groovy来写,一般我们会检查一下,是否产生了某某文件等等来判定,如果不正确的话抛出异常
然后我们在maven插件目录运行mvn integration-test就能进行集成测试了
C. maven site插件怎么用
maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。 maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性。
D. maven,pom.xml里配置了插件,是怎么使用的
根据你的描述:
在pom.xml中没有声明的加入这个plugin时,是按照1.3来进行编译的。你肯定不想用这么低的JDK版本把!
E. Maven组件插件无法执行问题,怎么解决
刚好我也碰到这样的问题,给你如下解决方案参考下:1、解决IE下flash插件背景颜色为白色的问题,不透明的问题;解决方法:可以给你的flash插件做一个跟网页背景颜色一样颜色的背景图片,然后把它作为flash插件的背景。2、解决IE下flash插件经常出现不能上传的问题;解决方法:给你的js中引入flash插件的网址后面加一个随机数,每次加载页面请求的这个flash文件的地址都不一样,这样来确保flash能被IE浏览器正常地播放和执行。
F. apache maven插件是怎么打jar包的
Java框架jar包是经过包装处理的,如果是java提供的文件,是不可以编辑的。替换文件之后,很有可能会编译不通过,建议不要替换,
G. 怎样在myeclipse2014中配置maven插件
1
创建maven工程,新建project,右键选择New Project,勾选快速创建选项,这个选项可以快速创建简单的maven工程。
多图
2
项目创建成功后,项目目录主要有:主代码目录、主资源目录、测试代码目录、测试资源目录、输出目录(代码编译存放的目录)。
3
添加项目依赖,查找项目依赖通常有两种方式:1. 直接在eclipse上查找,2. 在私服nexus上查找再复制依赖信息到pom.xml中。在eclipse中查找右键项目或pom.xml,输入关键信息查找,选中要引入的构件,点OK就可以自动引入。
多图
4
在nexus中查找依赖,打开nexus输入关键信息点击查找按钮,在搜索结果中找到对应的jar包,复制右下角的那段信息到pom.xml的dependencies下,如图所示。
多图
5
在MyEclipse上运行mvn命令,右键项目选择Run As--》Maven clean。mvn命令有很多,简单说明下比较常用的命令:
1. clean 用于清理输出目录target/
2. compile用于编译项目主代码
3. test 用于编译运行测试代码
4. package 接受编译好的代码,打包成可发布的模式
5. install 将包安装到maven本地仓库
6. Deploy将最终的包复制到远程仓库
执行以上命令时,clean是不会自动执行的,因为clean和其他5个命令是不同的生命周期,因此需要使用组合命令。
6
在MyEclipse中运行组合命令,右键项目选择Run As--》Maven build...
7
前面介绍了怎么运行一些命令,现在讲下怎么样运行实例。在主代码目录和测试目录上添加代码。
多图
8
运行命令clean install,运行结果如图所示,从结果可以看到,命令运行成功,运行了一次测试并且运行通过,同时,将jar打包到项目的target目录下,也安装到maven的的本地仓库上了。
多图
9
将jar包部署到私服nexus上,在pom.xml中添加一些配置,最后发布运行命令
clean deploy,发布后可以到私服nexus查找有没有刚刚部署的jar包
H. 如何用exec-maven-plugin插件执行jar包
solution:参数需要另外配置 link
<executable>java</executable>
<arguments>
<argument>-jar</argument>
<argument>target\XXX.jar</argument>
</arguments>
绑定在generate-sources上是为编译时提前自动生成代码
I. maven中插件plugin和依赖dependency的区别
插件是一种工具,例如compile插件是用来编译代码的工具,mybatis插件是用来自动生成数据库和mapper的工具。而依赖则是项目工程在编译过程中需要依赖的二方及三方包。在你的工程中可以不需要mybatis插件,自己去实现sql的crud,但如果工程里需要三房包,则必须要用dependency引入。