`
hellohank
  • 浏览: 145877 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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包中这些文件的名称是乱码!
这一点,请大家在处理项目时一定要注意!

2
0
分享到:
评论
4 楼 yujiaao 2013-11-06  
hellohank 写道
科学怪人007 写道
文件名为中文打war包 有什么方法可以解决这个问题(文件名中文乱码)

很可惜,还真没有好办法解决……因为打war包的插件是使用JDK中的zip方式进行的,所以,要想彻底解决这个问题,只能自己重写war打包插件的相关代码,使用ant的zip方式指定编码!
我们项目中就是这样解决的!可惜我的那个war插件的代码在非公网上,无法上传上来……

用JDK7可以解决zip文件名乱码的问题
3 楼 Hawkes 2012-12-13  
war包--GWT的发布包就是war包
2 楼 hellohank 2012-11-06  
科学怪人007 写道
文件名为中文打war包 有什么方法可以解决这个问题(文件名中文乱码)

很可惜,还真没有好办法解决……因为打war包的插件是使用JDK中的zip方式进行的,所以,要想彻底解决这个问题,只能自己重写war打包插件的相关代码,使用ant的zip方式指定编码!
我们项目中就是这样解决的!可惜我的那个war插件的代码在非公网上,无法上传上来……
1 楼 科学怪人007 2012-10-25  
文件名为中文打war包 有什么方法可以解决这个问题(文件名中文乱码)

相关推荐

    自定义maven插件的实现

    然而,有时候Maven的内置插件无法满足特定的需求,这时就需要自定义Maven插件来扩展其功能。本篇文章将深入探讨如何实现自定义的Maven插件。 首先,了解Maven插件的基本结构至关重要。一个Maven插件通常由一组Mojo...

    maven插件

    Maven插件的源码通常基于Java编写,利用Maven插件API来实现目标功能。通过阅读源码,我们可以更好地了解插件的内部机制,定制插件行为,或者创建自己的插件。 总结,Maven插件是Maven构建系统的核心部分,它们执行...

    自定义maven插件:自动生成API的word文档源代码

    2. **源代码分析**:插件运行时,会扫描指定的接口类和参数类,解析它们的注释、方法签名、参数类型等关键信息。这是生成API文档的基础数据。 3. **模板应用**:用户可以提供自定义的Word模板(如template.docx),...

    apach maven插件包

    总结起来,"Apache Maven插件包"是Java开发的重要工具,它简化了构建过程,统一了项目结构,提高了开发效率,并且通过强大的插件机制,可以扩展以满足各种复杂的构建需求。了解和掌握Maven,对于任何Java开发者来说...

    Mybatis+Maven插件

    4. **Maven插件**:Maven的插件机制十分强大,如`maven-compiler-plugin`用于编译Java源代码,`maven-surefire-plugin`负责运行单元测试。 结合Mybatis和Maven,我们可以使用Mybatis Generator插件来自动化生成DAO...

    eclipse4.5 mars 64位 自带Maven插件

    Eclipse Mars的一大亮点是它自带了Maven插件,这使得Java开发者可以直接在IDE内部管理他们的Maven项目,而无需额外安装插件。 Maven是Apache软件基金会开发的一个项目管理和综合工具,主要用于Java项目构建、依赖...

    maven 3.5.2 maven 3.5.2 maven 3.5.2

    1. **性能提升**: Maven 3.5.2对缓存机制进行了优化,提高了构建速度,减少了不必要的网络请求。 2. **更好的错误报告**: 提供更清晰的错误信息和堆栈跟踪,帮助开发者更快地定位问题。 3. **依赖管理增强**: 修复...

    Custom Maven Plugin

    3. **编写Mojo(Maven可执行目标)**:Mojo是Maven插件中的核心元素,代表一个可执行的目标。在Java类中定义Mojo,它必须继承自`org.apache.maven.plugin.Mojo`接口,并使用`@Mojo`注解标记。这个类包含了插件执行的...

    maven及eclipse插件下载和使用.zip

    通过了解和掌握Maven的使用,以及如何在Eclipse中集成Maven插件,开发者可以更加专注于编写代码,而不是处理构建问题。因此,对于Java开发者来说,学习和熟练运用Maven及其Eclipse插件是十分必要的。

    Maven 3.5.0版本资源

    例如,`maven-compiler-plugin`用于编译Java源代码,`maven-surefire-plugin`用于运行测试。 ** 总结 ** Maven 3.5.0作为Maven的重要版本,带来了性能提升、依赖管理优化、插件管理改进等多个方面的增强,使得Java...

    Maven the definitive guide

    Maven插件提供了扩展Maven功能的能力,每个插件包含一系列的目标,通过命令行调用特定的插件目标,可以执行各种构建任务,如生成文档、打包项目、部署到服务器等。 #### 站点生成与报告 Maven可以自动生成项目站点...

    maven mybatis 插件 自动生成持久层代码

    使用MyBatis Generator插件与Maven结合的步骤大致如下: 1. **添加依赖**:在Maven项目的pom.xml文件中,我们需要添加MyBatis Generator的依赖,这样Maven才能在构建过程中找到并执行生成代码的插件。 2. **配置...

    maven3.6.1和3.6.3安装包

    4. **插件**: Maven通过插件机制扩展功能,如编译、测试、打包、部署等都由对应的插件实现。 5. **项目信息管理**: POM文件不仅包含依赖信息,还记录项目的基本信息,如作者、版本、描述等。 **使用Maven** 1. **...

    apache-maven-3.6.0_apache-maven-3.6.0_maven压缩包_maven3.6.0下载_

    在开发过程中,`mvn install`命令会编译源代码,运行测试,并将结果部署到本地仓库,使得其他项目可以通过依赖管理机制引用。`mvn clean`用于清除构建生成的临时文件,而`mvn package`则会打包项目,生成最终的JAR或...

    Maven 与 Eclipse 的集成

    - **运行与调试**: 直接运行 Maven 的生命周期目标,如 "Run As" -&gt; "Maven Build",设置生命周期阶段(如 "install" 或 "test")。 - **管理依赖**: 可以通过 POM.xml 文件直接编辑依赖,Eclipse 会自动同步。 - ...

    apache-maven-3.3.9

    Maven的插件机制允许扩展其功能。例如,maven-compiler-plugin用于编译Java源代码,maven-surefire-plugin执行单元测试,maven-jar-plugin则用于打包项目为JAR文件。 **5. 核心组件** 在压缩包文件中,我们可以看到...

    maven仓库Windows64位

    Eclipse是一款流行的Java集成开发环境,可以通过Maven插件(如M2Eclipse)来集成Maven。安装M2Eclipse插件后,用户可以在Eclipse中直接创建、管理Maven项目,并且能自动同步本地Maven仓库与远程仓库的依赖。 ** ...

    apache-maven-3.8.5-bin

    1. **性能提升**: Maven 3.8.5 对缓存机制进行了优化,提升了依赖解析速度,使得构建过程更快。 2. **错误修复**: 该版本修复了之前版本中的一些已知问题,提高了稳定性。 3. **更好的多模块项目支持**: Maven ...

    maven3.8下载包

    4. **插件更新**:内置的Maven插件可能有新的功能或更新,以支持最新的技术栈。 5. **更好的用户体验**:可能改进了命令行接口,提供更友好的提示和反馈。 在使用Maven 3.8时,你需要根据自己的系统环境(Windows、...

    maven的rar包

    7. **Maven插件** - `maven-compiler-plugin`: 编译源代码。 - `maven-surefire-plugin`: 运行单元测试。 - `maven-jar-plugin`: 打包Java应用程序或库为JAR文件。 - `maven-war-plugin`: 打包Web应用程序为WAR...

Global site tag (gtag.js) - Google Analytics