`

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

 
阅读更多

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

<build>  
          
        <!-- 主资源目录 -->  
        <resources>  
            <resource>  
                <!-- 设定主资源目录  -->  
                <directory>src/main/resources</directory>  
                  
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型   
                <includes>  
                    <include>*.xml</include>  
                </includes>  
                 -->  
                   
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)   
                <excludes>  
                    <exclude>*.xml</exclude>  
                </excludes>  
                -->  
                  
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录  
                <targetPath>d:/</targetPath>  
                   -->  
                    
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->  
                <filtering>true</filtering>  
                  
            </resource>  
        </resources>  
    </build>

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

开发环境:

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

 生产环境:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>PrdDS</value>
</property>
<property name="resourceRef">
<value>false</value>
</property>
</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 version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 开发环境采用tomcat应用服务器,dbcp数据源管理 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="jdbc:oracle:thin:@localhost:1521:shell"/> 
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
<property name="username" value="scott"/>
<property name="password" value="admin123"/>
<property name="initialSize" value="1"/>
<property name="maxActive" value="2"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>prdDS</value>
</property>
<property name="resourceRef">
<value>false</value>
</property>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>

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

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

<?xml version="1.0" encoding="UTF-8"?>
<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.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>


<groupId>com.shell.maven.demo</groupId>
<artifactId>maven-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>

<name>maven-demo</name>
<url>http://maven.apache.org</url>

<properties>
<!-- system property -->
<encoding>UTF-8</encoding>
<maven.test.skip>true</maven.test.skip>
<skipTests>true</skipTests>

<!-- spring版本 -->
<springframework.version>3.1.0.RELEASE</springframework.version>
</properties>

<profiles>
<profile>
<id>prd</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- 在default生命周期的 validate阶段就执行resources插件的copy-resources目标 -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 指定resources插件处理资源文件到哪个目录下 -->
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<!--  也可以用下面这样的方式(指定相对url的方式指定outputDirectory)
<outputDirectory>target/classes</outputDirectory>
 -->
<!-- 待处理的资源定义 -->
<resources>
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/deploy/prd</directory>
<!-- 指定不需要处理的资源 
<excludes>
  <exclude>WEB-INF/*.*</exclude>
</excludes>
-->
<!-- 是否对待处理的资源开启过滤模式 (resources插件的copy-resources目标也有资源过滤的功能,这里配置的
这个功能的效果跟<build><resources><resource>下配置的资源过滤是一样的,只不过可能执行的阶段不一样,
这里执行的阶段是插件指定的validate阶段,<build><resources><resource>下的配置将是在resources插件的resources目标执行时起作用(在process-resources阶段))-->
<filtering>false</filtering>
</resource>
</resources>
</configuration>
<inherited></inherited>
</execution>
</executions>

</plugin>			
</plugins>
</build>
</profile>
</profiles>

<repositories>
<repository>
<id>myRepo</id>
<name>myRepo Repository</name>
<url>http://maven.infinitus.com.cn:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>myRepo</id>
<name>myRepo Repository</name>
<url>http://maven.infinitus.com.cn:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>

<build>

<!-- 
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
 -->
<plugins>
<!-- 指定在jdk1.6环境下编译 -->

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<!-- spring 有关jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${springframework.version}</version>
</dependency>

<!-- oracle 驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3.0</version>
</dependency>

<!-- 采用dbcp数据源 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>

<!-- comomons jar -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>

<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>

<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.3</version>
</dependency>
</dependencies>


</project>

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



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

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



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

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

<build>

 
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
   </build>

 

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

<build>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
   </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必须配置项的验证,有兴趣的可以敲代码验证。

分享到:
评论

相关推荐

    maven插件的demo

    在上面的例子中,我们绑定了`maven-resources-plugin`的`copy-resources`目标到`validate`阶段。 接下来,我们讨论自定义参数。Maven插件可以接受用户传递的参数以调整其行为。这些参数通常在`&lt;configuration&gt;`标签...

    Maven实战.docx

    - `&lt;resources&gt;`: 配置资源文件夹的位置及过滤选项。 通过上述介绍,我们可以看出 Maven 是一个功能强大且灵活的项目构建工具。它不仅可以帮助开发者自动化构建过程,还能有效地管理项目的依赖关系,简化开发流程...

    sshexec-maven-plugin:基于Jsch的ssh的文件上传和命令执行的Maven插件

    SSHExec Maven Plugin是一个用于在Maven构建过程中执行远程SSH命令和上传文件的插件。它依赖于Jsch库,这是一个Java实现的SSH2库,允许开发者通过SSH协议与远程服务器进行交互。这个插件极大地简化了在持续集成环境...

    maven_jar.zip

    在本案例中,我们讨论的是如何使用Maven来构建一个非Web应用,并将其打包成JAR文件,同时将配置文件与JAR文件进行分离。这个过程对于维护性和部署灵活性至关重要。 首先,让我们理解"Maven普通项目,非web"的含义。...

    idea的maven配置

    - **插件管理**:除了基本的构建命令,Idea还支持直接运行Maven插件的目标,如`maven-resources-plugin`的`copy-resources`目标。 3. `settings.xml`详解: - **用户配置**:`settings.xml`中的`&lt;userSettings&gt;`...

    Maven项目中读取src/main/resources目录下的配置文件的方法

    Maven项目中读取src/main/resources目录下的配置文件的方法 在Maven项目中,读取src/main/resources目录下的配置文件是一件非常重要的事情。在本文中,我们将介绍如何在Maven项目中读取src/main/resources目录下的...

    Maven的几个常用plugin

    - **maven-resources-plugin**:处理项目资源文件,如复制和过滤静态文件。 - **maven-surefire-plugin**:执行单元测试,生成测试报告。 - **maven-failsafe-plugin**:执行集成测试。 - **maven-war-plugin**:...

    本地maven工程自动发布

    3. Maven插件:为了实现自动打包,可以利用Maven的生命周期和插件机制。例如,使用maven-assembly-plugin或maven-jar-plugin来创建可执行的jar文件,同时配合maven-resources-plugin处理资源文件的复制。 4. Shell...

    详解用maven将dubbo工程打成jar包运行

    使用Maven将Dubbo工程打成jar包运行需要使用maven-jar-plugin、maven-dependency-plugin和maven-resources-plugin三个插件。 maven-jar-plugin maven-jar-plugin用于将项目编译成jar包。通过在pom.xml文件中添加...

    使用maven将Java程序打包成exe文件并制作成Windows系统服务之springboot打包(一)项目代码

    本篇主要介绍如何利用Maven这一强大的构建工具,配合特定的插件,实现Spring Boot应用的打包和在Windows上的服务化。 首先,`Spring Boot`是一款由Pivotal团队提供的开源框架,它基于Spring框架,旨在简化Java应用...

    Java中Maven项目导出jar包配置的示例代码

    本文详细介绍了Java中Maven项目导出jar包配置的示例代码,包括Maven项目结构、maven-jar-plugin配置和Maven项目打包命令。这些知识点对于Java开发者来说非常重要,可以帮助他们快速地构建和打包Java项目。

    配置pom.xml用maven打包java工程的方法(推荐)

    对于需求2和3,我们可以使用Maven的`maven-resources-plugin`插件来拷贝文件: ```xml &lt;groupId&gt;org.apache.maven.plugins &lt;artifactId&gt;maven-resources-plugin &lt;version&gt;3.1.0 &lt;id&gt;copy-resources-jar ...

    gradle 可运行demo 以及依赖资源包

    `type: Copy` 指定了这是一个复制任务,`from` 和 `into` 定义了源和目标目录,而 `include` 指定了要包含的文件模式。 通过这个可运行的Demo,你可以学习到Gradle如何管理项目依赖、如何定义和执行任务,以及如何...

    Intellij Idea 插件Gradle配置Demo

    IntelliJ IDEA是一款广受欢迎的Java开发集成环境,它的强大功能和灵活性部分归功于其丰富的插件系统。Gradle是一种先进的构建自动化工具,适用于多种编程语言,包括Java、Kotlin、Groovy等。在IntelliJ IDEA中配置...

    springboot整合vue项目(小试牛刀)

    在上面的配置中,我们使用了 Maven 的 resources 插件将 Vue 项目的静态文件拷贝到 Spring Boot 项目的静态资源目录中。 项目结构 下面是项目的结构: ``` springboot-vue src main java com example ...

    java解析资源文件

    在Java应用中,资源文件通常位于`src/main/resources`目录下(对于Maven或Gradle项目)。这些文件会被构建工具自动打包到最终的JAR或WAR文件中,以便于程序运行时访问。 1. **访问资源文件**: - **类路径加载**:...

    otherproject-copy

    这个"otherproject-copy"项目很可能使用了类似这样的结构,通过版本控制工具如Git进行管理,并利用Maven或Gradle这样的构建工具自动化构建和测试流程。开发者可以通过克隆这个仓库,然后在本地环境中运行和测试代码...

    SpringBoot如何实现分离资源文件并打包

    这时候可以通过在 pom.xml 文件中进行配置,从而使资源文件、依赖包和可执行文件分离。这样做的好处是更新代码的时候我们的 JAR 包很少改变,有利于维护。 在实现分离资源文件并打包时,可以使用 Spring Boot 的...

    SpringBoot2制作成Window服务的方法.docx

    在生产环境中,SpringBoot2应用通常需要以服务的形式运行,以确保系统启动时自动启动服务,并提供方便的管理和监控。本篇文章将详细讲解如何将SpringBoot2应用制作成Windows服务。 首先,我们需要对SpringBoot2项目...

Global site tag (gtag.js) - Google Analytics