使用maven-war-plugin 对Maven项目进行动态打包

简介:

在进行项目发布的时候,可能会碰到这样的情况, 希望在保持项目源代码不变的前提下,希望能够针对不同的运行环境获得相应的运行包.(比如war包)

那么使用配置文件是可以解决这个问题的.可以将项目中和运行环境相关的一些参数放到配置文件中, 每个环境一份,这样,在打包前只要指定这次打包我需要指定这次打包需要哪个配置文件即可,于是就可以使运行包与环境相对应了.但是这样的做法有个不好的是, 配置文件的选择需要人为干涉——如果碰到这样的情况:某某,你给我**环境的包. 这个时候, 采用平时的做法就是马上回忆我要去改下哪个地方, 让项目知道我要用什么配置了.

现在有另一个做法, 使用maven-war-plugin这个插件可以在执行打包命令的时候指定我要打哪个环境的包, 而不需要去关注我现在要用什么配置文件了.当然只适用于Maven项目.

例如: maven package –P  youEnvName   这样你就可以打出一个youEnvName环境的的运行包了.

第1步 还是要为不同环境准备不同的运行参数: 这里在src/main/resources 目录下建两个文件,分别用来配置两个环境的一些不同参数.注意,配置文件需要是一个合法的properties文件:如:

 
  1. src/main/resources/IProject-test.properties   
  2. src/main/resources/IProject-real.properties 

 分别对应测试和正式两个环境. 里面的内容当然就是两个key一个value不一个的key-value对了.

src/main/resources/IProject-test.properties 中的内容通常是这样(仅仅是样例)

 
  1. system.envid=real  
  2. method.version=1.0.0. release   
  3. ………  

第 2 步 ,在src/main下面新建一个目录,例如:src/main/packageFilter

然后将你要用到这个几个参数的那一个或多个配置文件文件找出来(通常这些配置文件是在WEB-INF目录中的),将他们移动到src/main/packageFilter目录中去.(这个时候你可能会问:配置文件换地方了,项目懂吗? 先不着急.)df 

这些配置到src/main/packageFilter目录中后,要对其中的使用上面配置的那几个参数作一下修改(仅仅是样例)

 
  1. <bean id="myService" class="com.nileader.MyService" init-method="init">  
  2.     <property name="version">  
  3.         <value>${ system.envid }</value>  
  4.     </property>  
  5. </bean

这里看到了吧, 参数已经用一个${key} 的占位符. 

第3步 ,在pom文件添加打包插件的依赖:

 
  1. <filters>  
  2.     <filter> src/main/resources/IProject-test.properties </filter>  
  3. </filters>  
  4. <plugin>  
  5.     <groupId>org.apache.maven.plugins</groupId>  
  6.     <artifactId>maven-war-plugin</artifactId>  
  7.     <configuration>  
  8.         <webResources>  
  9.             <resource>  
  10.                 <directory>src/main/packageFilter</directory>  
  11.                 <filtering>true</filtering>  
  12.                 <targetPath>WEB-INF</targetPath>  
  13.             </resource>  
  14.         </webResources>  
  15.     </configuration>  
  16. </plugin

这里就可以解决刚才提到的那个问题了,配置文件看上去已经移动了,但是并不需要告诉你的项目,其实在项目加载配置文件的时候,我们已经将一个完整的,不包含任何占位符的配置放在了项目本应该放的位置 ,这里由下面这段配置实现的:

 
  1. <resource>  
  2.     <directory>src/main/packageFilter</directory>  
  3.     <filtering>true</filtering>  
  4.     <targetPath>WEB-INF</targetPath>  
  5. </resource

这段配置的意思是: 在打包的时候,要将<directory>src/main/packageFilter</directory>中的文件全部搬到

  <targetPath>WEB-INF</targetPath>

目录中去,并且这个过程是覆盖的.   同时<filtering>true</filtering>指定了在这个”搬运”过程中,需要进行过滤.

另外,这里还有个标签: <filters>….</filters> 先不讲

好了,新的问题出来了,什么是过滤.现在进入最后一个步骤. 

第4步 , 还是在pom.xml文件中, 配置如下信息:

 
  1. <profiles>  
  2.     profile for bulid   
  3.     <profile>  
  4.         <id>test</id>  
  5.         <build>  
  6.             <filters>  
  7.                 <filter> src/main/resources/IProject-test.properties</filter>  
  8.             </filters>  
  9.         </build>  
  10.     </profile>  
  11.     <profile>  
  12.         <id>real</id>  
  13.         <build>  
  14.             <filters>  
  15.                 <filter> src/main/resources/IProject-real.properties</filter>  
  16.             </filters>  
  17.         </build>  
  18.     </profile>  
  19. </profiles>  


好了,现在知道了吧, 根据单词filter可以猜到这个配置是干嘛了.他的工作过程就是在打包的时候,

使用命令

mvn package –P real.

那么他就会找到<id>real</id>对应的那个参数信息src/main/resources/IProject- real.properties, 然后用其中的key-value对来过滤<directory>src/main/packageFilter< /directory>中的文件,并将填充完整后的配置文件全部搬运到<targetPath>WEB-INF</targetPath>中去.另外,由于配置<plugin>的时候留下一个标签

 
  1. <filters>  
  2.     <filter> src/main/resources/IProject-test.properties </filter>  
  3. </filters>  
  4. <plugin>  
  5. ……..  

这个就是所谓的默认参数,也就是当你执行 mvn package,他默认使用这个文件中的参数来过滤,相当于执行 

mvn package –P test. 

如何调试.

     从这里介绍的方法可以看出, 配置文件中的参数是在打包的时候才会被真正填充进去的, 那么对于那种希望在Eclipse中调试的项目怎么办.(例如用Jetty插件来调试Maven项目的时候, 并不会将项目打包后来执行, 而是直接运行src/main/webapp作为项目root路径.) 

    上面已经提到了,maven-war-plugin 在工作过程中是把 <directory>src/main/packageFilter</directory> 中的文件全部搬到 <targetPath>WEB-INF</targetPath>下,并且是覆盖.

所以可以这样处理,在开发 调试的时候,可以在配置文件的目录中放上完整的配置文件,里面的填充需要的参数,这位就可以顺利进行调试了, 并且不影响打包. 

注意事项

     现在可以调试了,但是要注意, 在开发调试过程中,如果对这个配置文件有改动,一定要反映到模板文件中去,所以建议在这个需要被填充的配置中添加上一些注释,可以提醒自己:

 
  1. <!-- 注意,对这个文件的任何修改必须同步到文件:src/main/packageFilter/****.xml,否则白改了. -->  

 



本文转自 nileader 51CTO博客,原文链接:http://blog.51cto.com/nileader/449956,如需转载请自行联系原作者
相关文章
|
1月前
|
Java Maven
手把手教你搭建Maven项目
手把手教你搭建Maven项目
31 0
|
2月前
|
Java Maven
java修改当前项目的maven仓库地址为国内
修改当前项目的maven仓库地址为国内
|
3月前
|
Dubbo Java 应用服务中间件
微服务框架(十)Maven Archetype制作Dubbo项目原型
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Maven Archetype的制作及使用,使用archetype插件制作Dubbo项目原型
|
3月前
|
前端开发 Java Maven
IEAD MAVEN创建springboot 项目
IEAD MAVEN创建springboot 项目
29 0
|
3月前
|
Java API Maven
JFinal5+Jetty2009+IDEA2020+Java8的非Maven-Demo项目
JFinal5+Jetty2009+IDEA2020+Java8的非Maven-Demo项目
22 1
|
30天前
|
Java Maven 开发工具
maven导入项目出现Unable to import maven project: See logs for details
maven导入项目出现Unable to import maven project: See logs for details
11 0
maven导入项目出现Unable to import maven project: See logs for details
|
29天前
|
Java Maven
maven项目导出可执行jar
maven项目导出可执行jar
28 0
|
30天前
|
Java Maven
运行maven项目出现Error:java: JDK isn‘t specified for module ‘XXX‘
运行maven项目出现Error:java: JDK isn‘t specified for module ‘XXX‘
14 0
|
1月前
|
XML Java Maven
深入探讨Maven打包:打造精致的Zip包
本文介绍了如何使用Maven将Spring Boot项目打包并部署。首先,利用Maven Assembly Plugin创建包含JAR的ZIP文件,以便于部署和修改配置文件。该插件允许自定义打包内容和格式。在`package.xml`中定义了打包格式、依赖、脚本和资源文件的规则。接着,在POM.xml中配置插件,排除配置文件和静态资源以保持外部。最后,执行`mvn package`命令生成分发包,简化了项目的部署流程。
92 2
|
1月前
|
JavaScript Java 关系型数据库
实例!使用Idea创建SSM框架的Maven项目
实例!使用Idea创建SSM框架的Maven项目
38 0

热门文章

最新文章

推荐镜像

更多