Maven插件运行机制与编写

MAVEN运行基本过程

Maven运行周期

每次使用maven的命令进行一些操作时,都是一个运行周期!详细的运行周期信息参考其官网描述: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference.
这是给出一个默认的一个生命周期(每个命令,其周期不同,具体参考上面网址上的内容):
validate、compile、test、package、integration、verify、install、deploy

Maven插件运行方式

如上所述,Maven在运行时会按照一定的生命周期进行运行,每个周期叫一个phase!在每个phase时,maven会看环境(即pom.xml)中配置了哪些插件,然后会运行它!

Maven插件的一些基本设置

Packaging

作为一个maven插件项目,它的项目组织方式packaging应该为maven-plugin。这一点很重要,选择这一选项,在项目打包发布时它将为你的项目自动生成一些maven必要的文件!

Goal

这个参数指定运行哪个目标逻辑。因为在一个maven插件中,可以设定若干个执行目标,如我们经常使用的maven-war-plugin,它的goal也有好几个,如war、help、inplace等等。
对应的就是对应插件的命令。如果有多个的话,有默认启动的配置方式。

Phase

这个参数就是指定该插件在哪个阶段启动!可以在使用时在pom.xml中重新定义!

plugin.xml

每个maven插件都有这样一个配置插件参数与环境的配置文件!比如,上面说的默认情况下指定运行哪个goal、参数的默认值等等!
详细的maven插件开发指南可以参考:http://maven.apache.org/plugin-developers/index.html

键值内容替换

背景及需求

作为一个项目,它分为开发环境与正式发布环境!这两个环境的一些系统参数配置是不一样的,需要在打包发布时区分对待。而我们的所有系统参数是配置在properties文件中,使用提键值对方式存储。要实现在正式环境发布时替换其中的一些参数值,就需要在maven正式环境上打包时需要实现替换操作!而这个过程肯定要交给插件在处理!

插件库是否有这样的插件

基于上述的实际情况的需求,于是在网上找了一下有没有这样的插件,结果只有一个文本替换的插件,而不是键值对替换的插件,而这个插件对于我们来说,使用的风险较大!因此,我决定自己写一个插件来实现该功能!

设定目标与逻辑

目标:实现键值对的替换!同时支持在pom.xml中使用时指定Map或指定键值对的文件(可以是多个文件)来实现结果的替换。
逻辑:检查结果键值对信息(Map或者是文件)是否存在,然后分别将结果键值对读取并合并到一个临时Map中,同时将需要替换的键值对文件中的信息读取到内存中,然后将结果中的内容替换到目标Map中!然后将目标Map重新生成properties文件!
当然,在测试环境打包时,可以指定跳替换,这样就保持了我们开发属性,只有在正式发布时才指定为替换操作!

css/js引用织入

背景及需求

这个需求是我们设计人员在设计页面时遇到的烦恼。当设计人员在设计一个页面的样式时,他会发现很多的页面的样式引用的css/js都差不多,而且有的css还具有一定的关联性(即引用A的时候必须要引用B),但每次都要写多次引用,有时候可能还会写丢掉某个,这样每次还要关心该页面引用哪个样式等。于是他想问:有没有一种import方式,就写代码一样,我在写一个css的时候,只要指定它依赖的css就可以了,这样不就减少了我去关心总共要引入哪些css的精力,而让我更多滴去关心业务的设计?

插件库是的现有插件

在这样的一种诉求下,我们本着不重复造轮子的理念,去网上寻求方法,结果没有一个简单易用的插件!

设定目标与逻辑

在求人不成,只能求已的情况下,我们采用了一种自定义的织入方式。其使用方式为:只要在css中定义了import关键字,程序就会把引入的css内容织入到该css中,另外,该插件还支持嵌套方式引用,即import的css中还可以支持import!
不过在该插件的使用有,有几个注意的地方:

  1. @import引用的文件要写完整,即,从指定的cssDirPath路径下开始写起,不支持"../"这样的相对方式,如@import url("css/oss.css")
  2. 注意url中路径前面有“/”与没有“/”是不同的路径,如:@import url("/css/oss.css")与@import url("css/oss.css")指定的路径是不相同的,
    • @import url("/css/oss.css")指:引入webapp文件夹下的css/oss.css;
    • @import url("css/oss.css")指 :引入当前文件所在文件夹下的css/oss.css;
      即,有“/”表示从网站根目录开始查找。
  3. 如果有两个或两个以上的@import引用,则每个@import各占一行。不能写在同一行!
  4. @import格式一定要遵守@import url("oss文件"),其中,@import与url之间至少要有一个空格。
  5. 如果有其它对css文件内容进行处理的,则将该插件放在这些插件之前。
  6. 不要重复引用。如下面这样,只会替换第一个:
    • @import url("css/oss.css")
    • @import url("css/oss.css")

文件复制

背景及需求

其实这个插件的出现是无奈的,是css织入插件的副产品!本来想合并到css织入的插件中,但考虑到css织入的插件已经可用且没有bug,如果再将该插件集成进去,那后果就可能难以预测,所以自己再写一个独立的插件。
为什么会是副产品呢?当我们的css织入插件在将css内容织入好之后放到了target打包下的目录中后,maven的war包插件会有一个资源复制的过程,会将我们已经织入好的css文件又重新替换成了原来的import方式的内容!而war包插件中又无法配置指定几个文件不替换的功能,于是便有了这个插件!

设定目标与逻辑

目标:实现项目中指定文件及文件夹的复制到target目录中,便于最终打包!
逻辑:可以指定对哪些文件进行复制,以及指定如果有的文件已经存在时是否强制替换!在pom.xml中使用时,将war包的插件的文件复制功能去除,启用该插件功能以防止已经织入好的文件被替换!

实用Maven设置

插件的合并

正如上面对插件的goal参数的说明,其实这三个插件是可以合并到一个插件项目中,有三个Mojo(即目标命令)。但因为这三个插件是在项目的研发过程中一个个出现的,而且考虑到对前一个插件不影响的前提下,一直没有将其合并到一个项目中!

Profile的使用

正如我们键值替换插件的产生背景所说的:在开发库与正式库之间的一些环境配置是不一样的!也就是说,在测试打包时运行的命令与正式环境打包时运行的命令是不一样的!这种不同环境运行不同的命令的情况,使用的就是Maven的profile定义。该定义可以在settings.xml或pom.xml中指定若干个id不同的profile,分别指定不同的一些环境变量!如:采购项目的profile配置为:

	<profiles>
		<profile>
			<id>prod</id>
			<properties>
				<zip.skip>false</zip.skip>
				<replace.skip>false</replace.skip>
				<package.excludes>WEB-INF/lib/not_exists.file</package.excludes>
			</properties>
		</profile>
		<profile>
			<id>dev</id>
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
			<properties>
				<zip.skip>true</zip.skip>
				<replace.skip>true</replace.skip>
				<package.excludes>WEB-INF/lib/*.jar</package.excludes>
			</properties>
		</profile>
	</profiles>

使用时使用命令如:mvn package –P prod。上面的配置表示,如果不指定P参数,则默认为dev

内存参数的设置

在一些大型的项目中,项目的模块较多或项目的内容较大时,在运行Maven的一些打包等命令时会出现内存溢出的问题,这时候,解决的办法只是需要我们改变一下maven的内存参数设置即可!其改变步骤参考:http://192.168.21.248:83/confluence_dev/pages/viewpage.action?pageId=21102871

上传第三方jar包与源码

有时候,我们需要用到一些第三方jar包,而很不幸滴是,这些jar包组织方式并不是Maven方式,你无法使用Maven的dependency来引用它,这时我们需要做的就是将其上传到我们的maven库中即可!但如果这个jar包既有jar包又有源码包时该如何上传呢?好吧,其实解决办法很简单,将两个jar包同时上传,如果名字有冲突请取个别名即可!相应文档参数: http://192.168.21.248:83/confluence_dev/pages/viewpage.action?pageId=33619970

文件名为中文打war包

最后要说的是war包插件!这个插件不止一次为我找来了不必要的麻烦!在war包进行打war包的过程中,它使用的是环境默认编码,而且它不支持配置使用指定的编码(那段代码那边有一个令人无限期待下去的TODO标记)!!于是,如果你的项目中有文件的名称为非ascii码的字符时……你就会很悲惨滴发现在war包中这些文件的名称是乱码!
这一点,请大家在处理项目时一定要注意!

你可能感兴趣的:(maven插件)