利用maven中resources插件的copy-resources目标进行资源copy和过滤

maven用可以利用如下配置进行资源过滤,pom.xml的配置如下:

Xml代码  

  1. <build>
  2. <!-- 主资源目录 -->
  3. <resources>
  4. <resource>
  5. <!-- 设定主资源目录  -->
  6. <directory>src/main/resources</directory>
  7. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型
  8. <includes>
  9. <include>*.xml</include>
  10. </includes>
  11. -->
  12. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)
  13. <excludes>
  14. <exclude>*.xml</exclude>
  15. </excludes>
  16. -->
  17. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录
  18. <targetPath>d:/</targetPath>
  19. -->
  20. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
  21. <filtering>true</filtering>
  22. </resource>
  23. </resources>
  24. </build>

利用这个特性可以解决开发跟生产环境数据库连接配置等问题,但有时这个特性并不符合实际。比如,开发环境我们使用tomcat应用服务器,使用dbcp数据源,但是生产则使用jboss应用服务器,使用jndi来管理数据源。开发环境跟生产环境spring容器中对于id=dataSources的bean的配置如下所示:

开发环境:

Xml代码  

  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  2. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
  3. <property name="url" value="jdbc:oracle:thin:@localhost:1521:gbst" /> <!-- 开发库 -->
  4. <property name="username" value="admin" />
  5. <property name="password" value="admin" />
  6. <property name="initialSize" value="1"/>
  7. <property name="maxActive" value="2"/>
  8. </bean>

生产环境:

Xml代码  

  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  2. <property name="jndiName">
  3. <value>PrdDS</value>
  4. </property>
  5. <property name="resourceRef">
  6. <value>false</value>
  7. </property>
  8. </bean>

像这种情况,靠<build><resources><resource>的资源过滤功能就不太实用了,这时可以采用resources插件的copy-resources目标进行资源copy,来达到分别配置开发环境与生产环境的数据库连接信息及其它一些配置(缓存服务器地址、短信网关系统连接配置等等),下面分步骤来达到这一目的。

第一步,实用maven穿件一个maven 工程(maven-demo),工程结构如下图:

第二部,在resources下定义spring的配置文件、log4j.properties等文件,并同时在main目录下创建一个deploy的目录,在deploy目录下创建一个prd的目录,然后在prd的目录下也定义一个spring的配置文件、log4j的文件,文件名相同,只是里面的配置的内容不同。添加文件后的maven-demo工程目录结构如下图:


 
 main/resoures下的spring配置文件内容如下:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  4. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
  5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
  10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
  11. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  12. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  13. <!-- 开发环境采用tomcat应用服务器,dbcp数据源管理 -->
  14. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  15. <property name="url" value="jdbc:oracle:thin:@localhost:1521:shell"/>
  16. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
  17. <property name="username" value="scott"/>
  18. <property name="password" value="admin123"/>
  19. <property name="initialSize" value="1"/>
  20. <property name="maxActive" value="2"/>
  21. </bean>
  22. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  23. <property name="dataSource" ref="dataSource"></property>
  24. </bean>
  25. </beans>

main/deploy/prd目录下的spring配置文件内容如下:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  4. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
  5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
  10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
  11. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  12. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  13. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  14. <property name="jndiName">
  15. <value>prdDS</value>
  16. </property>
  17. <property name="resourceRef">
  18. <value>false</value>
  19. </property>
  20. </bean>
  21. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  22. <property name="dataSource" ref="dataSource"></property>
  23. </bean>
  24. </beans>

(log4j.properties内容就不列出了,如果要想使得开发环境跟生产环境不一样的配置,原理跟spring的配置文件一样的)

第三步,配置pom.xml文件,内容如下:

Xml代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.shell.maven.demo</groupId>
  6. <artifactId>maven-demo</artifactId>
  7. <version>1.0.0-SNAPSHOT</version>
  8. <name>maven-demo</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <!-- system property -->
  12. <encoding>UTF-8</encoding>
  13. <maven.test.skip>true</maven.test.skip>
  14. <skipTests>true</skipTests>
  15. <!-- spring版本 -->
  16. <springframework.version>3.1.0.RELEASE</springframework.version>
  17. </properties>
  18. <profiles>
  19. <profile>
  20. <id>prd</id>
  21. <build>
  22. <plugins>
  23. <plugin>
  24. <groupId>org.apache.maven.plugins</groupId>
  25. <artifactId>maven-resources-plugin</artifactId>
  26. <version>2.6</version>
  27. <executions>
  28. <execution>
  29. <id>copy-resources</id>
  30. <!-- 在default生命周期的 validate阶段就执行resources插件的copy-resources目标 -->
  31. <phase>validate</phase>
  32. <goals>
  33. <goal>copy-resources</goal>
  34. </goals>
  35. <configuration>
  36. <!-- 指定resources插件处理资源文件到哪个目录下 -->
  37. <outputDirectory>${project.build.outputDirectory}</outputDirectory>
  38. <!--  也可以用下面这样的方式(指定相对url的方式指定outputDirectory)
  39. <outputDirectory>target/classes</outputDirectory>
  40. -->
  41. <!-- 待处理的资源定义 -->
  42. <resources>
  43. <resource>
  44. <!-- 指定resources插件处理哪个目录下的资源文件 -->
  45. <directory>src/main/deploy/prd</directory>
  46. <!-- 指定不需要处理的资源
  47. <excludes>
  48. <exclude>WEB-INF/*.*</exclude>
  49. </excludes>
  50. -->
  51. <!-- 是否对待处理的资源开启过滤模式 (resources插件的copy-resources目标也有资源过滤的功能,这里配置的
  52. 这个功能的效果跟<build><resources><resource>下配置的资源过滤是一样的,只不过可能执行的阶段不一样,
  53. 这里执行的阶段是插件指定的validate阶段,<build><resources><resource>下的配置将是在resources插件的resources目标执行时起作用(在process-resources阶段))-->
  54. <filtering>false</filtering>
  55. </resource>
  56. </resources>
  57. </configuration>
  58. <inherited></inherited>
  59. </execution>
  60. </executions>
  61. </plugin>
  62. </plugins>
  63. </build>
  64. </profile>
  65. </profiles>
  66. <repositories>
  67. <repository>
  68. <id>myRepo</id>
  69. <name>myRepo Repository</name>
  70. <url>http://maven.infinitus.com.cn:8081/nexus/content/groups/public/</url>
  71. <releases>
  72. <enabled>true</enabled>
  73. </releases>
  74. <snapshots>
  75. <enabled>true</enabled>
  76. </snapshots>
  77. </repository>
  78. </repositories>
  79. <pluginRepositories>
  80. <pluginRepository>
  81. <id>myRepo</id>
  82. <name>myRepo Repository</name>
  83. <url>http://maven.infinitus.com.cn:8081/nexus/content/groups/public/</url>
  84. <releases>
  85. <enabled>true</enabled>
  86. </releases>
  87. <snapshots>
  88. <enabled>true</enabled>
  89. </snapshots>
  90. </pluginRepository>
  91. </pluginRepositories>
  92. <build>
  93. <!--
  94. <resources>
  95. <resource>
  96. <directory>src/main/resources</directory>
  97. <filtering>true</filtering>
  98. </resource>
  99. </resources>
  100. -->
  101. <plugins>
  102. <!-- 指定在jdk1.6环境下编译 -->
  103. <plugin>
  104. <groupId>org.apache.maven.plugins</groupId>
  105. <artifactId>maven-compiler-plugin</artifactId>
  106. <version>3.1</version>
  107. <configuration>
  108. <source>1.6</source>
  109. <target>1.6</target>
  110. </configuration>
  111. </plugin>
  112. </plugins>
  113. </build>
  114. <dependencies>
  115. <!-- spring 有关jar -->
  116. <dependency>
  117. <groupId>org.springframework</groupId>
  118. <artifactId>spring-core</artifactId>
  119. <version>${springframework.version}</version>
  120. </dependency>
  121. <dependency>
  122. <groupId>org.springframework</groupId>
  123. <artifactId>spring-context</artifactId>
  124. <version>${springframework.version}</version>
  125. </dependency>
  126. <dependency>
  127. <groupId>org.springframework</groupId>
  128. <artifactId>spring-beans</artifactId>
  129. <version>${springframework.version}</version>
  130. </dependency>
  131. <dependency>
  132. <groupId>org.springframework</groupId>
  133. <artifactId>spring-web</artifactId>
  134. <version>${springframework.version}</version>
  135. </dependency>
  136. <dependency>
  137. <groupId>org.springframework</groupId>
  138. <artifactId>spring-jdbc</artifactId>
  139. <version>${springframework.version}</version>
  140. </dependency>
  141. <!-- oracle 驱动 -->
  142. <dependency>
  143. <groupId>com.oracle</groupId>
  144. <artifactId>ojdbc6</artifactId>
  145. <version>11.2.0.3.0</version>
  146. </dependency>
  147. <!-- 采用dbcp数据源 -->
  148. <dependency>
  149. <groupId>commons-dbcp</groupId>
  150. <artifactId>commons-dbcp</artifactId>
  151. <version>1.4</version>
  152. </dependency>
  153. <!-- comomons jar -->
  154. <dependency>
  155. <groupId>commons-lang</groupId>
  156. <artifactId>commons-lang</artifactId>
  157. <version>2.4</version>
  158. </dependency>
  159. <dependency>
  160. <groupId>commons-io</groupId>
  161. <artifactId>commons-io</artifactId>
  162. <version>2.4</version>
  163. </dependency>
  164. <dependency>
  165. <groupId>commons-logging</groupId>
  166. <artifactId>commons-logging</artifactId>
  167. <version>1.1.1</version>
  168. </dependency>
  169. <dependency>
  170. <groupId>commons-collections</groupId>
  171. <artifactId>commons-collections</artifactId>
  172. <version>3.2</version>
  173. </dependency>
  174. <dependency>
  175. <groupId>commons-beanutils</groupId>
  176. <artifactId>commons-beanutils</artifactId>
  177. <version>1.8.3</version>
  178. </dependency>
  179. </dependencies>
  180. </project>

resources插件的目标共有三个,见下图:(截图自Apache官网)


 分别是resources目标  testResources目标 及copy-resources目标。

resources目标默认绑定到了default生命周期的process-resources阶段, testResources目标默认绑定到了default生命周期的process-test-resources阶段。default生命周期阶段及resources插件这两个目标绑定的阶段和主要作用见下图:


 对于上图中说到的这两个插件目标的主要功能需要进行一下补充:

如果配置了如下代码,那么这个时候resources插件的resources目标会进行资源过滤处理,pom.xml配置如下:

Xml代码  

  1. <build>
  2. <resources>
  3. <resource>
  4. <directory>src/main/resources</directory>
  5. <filtering>true</filtering>
  6. </resource>
  7. </resources>
  8. </build>

同样,如果配置了如下代码,那么这个时候resources的testResources目标会进行资源过滤处理,pom.xml配置如下:

Xml代码  

  1. <build>
  2. <testResources>
  3. <testResource>
  4. <directory>src/test/resources</directory>
  5. <filtering>true</filtering>
  6. </testResource>
  7. </testResources>
  8. </build>

现在回到讲解resources插件的copy-resources目标上来,这个插件目标有两项内容是必须配置的,见下图:

resources插件的resources目标跟testResources目标都只有outputDirectory一个必须的配置项(都表示要讲资源文件处理到那个目录下去),而copy-resources目标多了一个resources的必须配置项,我个人的理解是这样的。首先这个resources配置项也是用来处理资源的,也包含资源过滤等功能,而copy-resources插件目标往往需要配置到resources插件目标及testResources插件目标的绑定的阶段的前面的阶段去执行,所以在resources插件目标还没有起作用执行时,可以利用copy-resources的resources必须配置项做一些预处理,比如资源过滤等(这里的resources必须项配置了之后由copy-resoueces插件目标来执行,与<build><resources><resources>下的配置没有直接关系,而且互不干涉。可以这么去理解,在main/deploy/prd下的spring配置文件,如果里面也有一些内容是用${properties}来写的,那里在copy-resources插件目标执行拷贝操作前做一个资源过滤的处理,这个功能实现就得靠copy-resouces插件目标的resources必须配置项来完成了)。

第四步,验证效果。先运行mvn clean install命令,然后查看applicationContext.xml文件的内容,再运行mvn clean install -P prd 命令,然后查看applicationContext.xml文件的内容,比较两次有何不同。

执行mvn clean install命令如下图:

运行成功,如下图:

编译成功后查看编译后的applicationContext.xml文件内容,如下图:


 从图中可以看到,id=dataSource的配置是开发环境的。

现在运行mvn clean install -P prd命令,如下图:

运行成功,如下图:

此时再来查看编译后的applicationContext.xml文件的内容,如下图:


 从上图中可以看到,applicationContext.xml文件被替换成生产环境下的了。

以上就是resources插件的copy-resources插件目标的作用。对于该插件目标下的resources必须配置项的验证,有兴趣的可以敲代码验证。

时间: 2024-10-23 16:35:33

利用maven中resources插件的copy-resources目标进行资源copy和过滤的相关文章

maven中jetty插件配置

maven中jetty插件的配置,可用于项目在内置jetty服务器中的部署. <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <configuration> <contextPath>/Demo1</contextPath> <connectors> <conne

MAVEN中的插件放在哪个dependcies里面

如果你用maven来管理项目的话,你会发现你要依赖很多plugin,于是引出了一个问题. 一个project中可能有两个<dependcies>这个tag, 如下 <dependcies> a </dependcies> <build> <dependcies> b </dependcies> </build> 这两个dependcies有什么区别呢? 在maven的官网上我找到了答案: https://maven.apa

maven中tomcat7-maven-plugin插件的使用

1.(挺清晰,但是我在项目上尝试没有成功) http://blog.csdn.net/yhhazr/article/details/7866501 2.(算是有一些详细的运行命令吧,例如自动打包命令或者启动tomcat) http://blog.csdn.net/binyao02123202/article/details/17793233 http://www.cnblogs.com/AloneSword/p/4100072.html 3.(内容较多吧,没仔细看) http://my.osch

利用Eclipse中的Maven构建Web项目报错(二)

利用Eclipse中的Maven构建Web项目 1.错误描写叙述 [INFO] Scanning for projects... [INFO] [INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1 [INFO] [INFO] ---------------------------------

利用Eclipse中的Maven构建Web项目(二)

利用Eclipse中的Maven构建Web项目 1.新建源文件夹,Java Resources鼠标右键,"New-->Source Folder" 2.新建src/main/java   src/main/resources  src/test/java  src/test/resources四个源包 3.双击每个文件夹的Output folder,选择路径 src/main/java和src/main/resources,选择路径target/classes; src/test

利用Eclipse中的Maven构建Web项目(一)

利用Eclipse中的Maven构建Web项目 1.新建一个Maven Project,"New-->Other..." 2.选择"Maven Project" 3.选择项目路径 Usedefault Workspace location默认工作空间, 选择项目类型 在Artifact Id中选择maven-archetype-webapp 4.分别输入Group Id.Artifact Id和Package,单击"Finish" 5.Ma

利用Eclipse中的Maven构建Web项目(三)

利用Eclipse中的Maven构建Web项目 1.将Maven Project转换成动态Web项目,鼠标右键项目,输入"Project Facets" 2.根据Dynamic Web Module的版本修改Java Compiler中的"Compiler compliance level"的版本 3.设置部署程序集(Web Deployment Assembly),删除含有"test" 4.将Maven的jar包发布到lib下, "A

利用Eclipse中的Maven构建Web项目报错

利用Eclipse中的Maven构建Web项目 1.在进行上述操作时,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.o

利用Google Chrome开发插件,在网页中植入js代码

Google Chrome是一个很强大的浏览器,提供了各种各样的插件,大大提升了使用了的效率,比如vimium.honx等. Google在提供这些插件的同时还允许用户开发自己的插件. 最近在写js的脚本采集程序,需要测试在网页中的运行情况,因此可以利用Chrome插件进行测试. 1.首先第一步是新建一个文件夹,并新建一个manifest.json文件,内容如下 { "manifest_version": 2, "name": "Js implants&q