版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011781521/article/details/79052725

一、简介

构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。

● src/main/java和src/test/java 

这两个目录中的所有*.java文件会分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉。

● src/main/resouces和src/test/resources

这两个目录中的文件也会分别被复制到target/classes和target/test-classes目录中。

● target/classes

打包插件默认会把这个目录中的所有内容打入到jar包或者war包中。

如下所示:

二、Maven项目的标准目录结构

  • src

    • main

      • java         源文件
      • resources    资源文件
      • filters   资源过滤文件
      • config   配置文件
      • scripts   脚本文件
      • webapp   web应用文件
    • test
      • java    测试源文件
      • resources    测试资源文件
      • filters    测试资源过滤文件
    • it       集成测试
    • assembly    assembly descriptors
    • site    Site
  • target
    • generated-sources
    • classes
    • generated-test-sources
    • test-classes
    • xxx.jar
  • pom.xml
  • LICENSE.txt
  • NOTICE.txt
  • README.txt
 

三、打包时资源文件的配置

3.1、打包src/main/java目录下的xml

一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,maven能把这些资源文件打包到相应的jar或者war里。

有时候,比如mybatis的mapper.xml文件,我们习惯把它和Mapper.java放一起,都在src/main/java下面,这样利用maven打包时,就需要修改pom.xml文件,来把mapper.xml文件一起打包进jar或者war里了,否则,这些文件不会被打包的。(maven认为src/main/java只是java的源代码路径)

下面通过一个简单的示例来说明:

项目结构如下所示,有两个UserMaper.xml文件,所在目录不同

默认情况下,在POM.XML目录下执行: mvn clean package 打包命令在target\classes目录下不会把UserMapper.xml打包到下mapper目录下

而resources目录下的文件始终都会打包进jar包或war包

这个时候使用mybatis就会出一些问题,找不到UserMapper所对应的xml文件解决方法有如下几种:

(1)配置POM.XML的resource把xml也打包到mapper目录下

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

其中**/*这样的写法,是为了保证各级子目录下的资源文件被打包。resources是可以看做是容器,这个容器里面可以放很多个像resource这样的配置。而directory就是配置文件所在的路径,includes从英文单词角度看,就是包含的意思,此时在执行命令,就会把xml也打包到mapper目录下了

Resources官方文档地址为:http://maven.apache.org/pom.html#Resources

(2)maven-resources-plugin插件

为了使项目结构更为清晰,Maven区别对待Java代码文件和资源文件,maven-compiler-plugin用来编译Java代码,maven-resources-plugin则用来处理资源文件。

默认的主资源文件目录是src/main/resources,很多用户会需要添加额外的资源文件目录,这个时候就可以通过配置maven-resources-plugin来实现。

  1.  
    <!--
  2.  
    此plugin可以用
  3.  
    利用此plugin,把源代码中的xml文件,打包到相应位置,
  4.  
    这里主要是为了打包Mybatis的mapper.xml文件
  5.  
    -->
  6.  
    <plugin>
  7.  
    <artifactId>maven-resources-plugin</artifactId>
  8.  
    <version>2.5</version>
  9.  
    <executions>
  10.  
    <execution>
  11.  
    <id>copy-xmls</id>
  12.  
    <phase>process-sources</phase>
  13.  
    <goals>
  14.  
    <goal>copy-resources</goal>
  15.  
    </goals>
  16.  
    <configuration>
  17.  
    <outputDirectory>${basedir}/target/classes</outputDirectory>
  18.  
    <resources>
  19.  
    <resource>
  20.  
    <directory>${basedir}/src/main/java</directory>
  21.  
    <includes>
  22.  
    <include>**/*.xml</include>
  23.  
    </includes>
  24.  
    </resource>
  25.  
    </resources>
  26.  
    </configuration>
  27.  
    </execution>
  28.  
    </executions>
  29.  
    </plugin>

此外,资源文件过滤也是Maven的一大特性,你可以在资源文件中使用${propertyName}形式的Maven属性,然后配置maven-resources-plugin开启对资源文件的过滤,之后就可以针对不同环境通过命令行或者Profile传入属性的值,以实现更为灵活的构建。

  1.  
    <plugin>
  2.  
    <groupId>org.apache.maven.plugins</groupId>
  3.  
    <artifactId>maven-resources-plugin</artifactId>
  4.  
    <configuration>
  5.  
    <encoding>UTF-8</encoding>
  6.  
    <!-- 过滤后缀为pem、pfx的证书文件 -->
  7.  
    <nonFilteredFileExtensions>
  8.  
    <nonFilteredFileExtension>pem</nonFilteredFileExtension>
  9.  
    <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
  10.  
    <nonFilteredFileExtension>p12</nonFilteredFileExtension>
  11.  
    </nonFilteredFileExtensions>
  12.  
    </configuration>
  13.  
    </plugin>

(3)build-helper-maven-plugin插件

  1.  
    <!--
  2.  
    此plugin可以用
  3.  
    利用此plugin,把源代码中的xml文件,
  4.  
    打包到相应位置,这里主要是为了打包Mybatis的mapper.xml文件
  5.  
    -->
  6.  
    <plugin>
  7.  
    <groupId>org.codehaus.mojo</groupId>
  8.  
    <artifactId>build-helper-maven-plugin</artifactId>
  9.  
    <version>1.8</version>
  10.  
    <executions>
  11.  
    <execution>
  12.  
    <id>add-resource</id>
  13.  
    <phase>generate-resources</phase>
  14.  
    <goals>
  15.  
    <goal>add-resource</goal>
  16.  
    </goals>
  17.  
    <configuration>
  18.  
    <resources>
  19.  
    <resource>
  20.  
    <directory>src/main/java</directory>
  21.  
    <includes>
  22.  
    <include>**/*.xml</include>
  23.  
    </includes>
  24.  
    </resource>
  25.  
    </resources>
  26.  
    </configuration>
  27.  
    </execution>
  28.  
    </executions>
  29.  
    </plugin>

3.2、src/main/resources目录下的xml等资源文件不被打包

默认resources目录下的文件都会被打包,如果想resources目录下的xml文件不被打包,可通过如下配置:

  1.  
    <!--过滤resource下的文件-->
  2.  
    <resources>
  3.  
    <resource>
  4.  
    <directory>src/main/resources</directory>
  5.  
    <includes>
  6.  
    <include>*.properties</include> <!--打包properties文件-->
  7.  
    </includes>
  8.  
    <excludes>
  9.  
    <exclude>*.xml</exclude> <!--过滤xml与yaml文件-->
  10.  
    <exclude>*.yaml</exclude>
  11.  
    </excludes>
  12.  
    </resource>
  13.  
    </resources>

编译之后如下:

当然也可以通过插件来实现

  1.  
    <plugin>
  2.  
    <artifactId>maven-resources-plugin</artifactId>
  3.  
    <executions>
  4.  
    <execution>
  5.  
    <id>copy-resources</id>
  6.  
    <phase>validate</phase>
  7.  
    <goals>
  8.  
    <goal>copy-resources</goal>
  9.  
    </goals>
  10.  
    <configuration>
  11.  
     
  12.  
    <!-- 并把文件复制到target/conf目录下-->
  13.  
    <outputDirectory>${project.build.directory}/conf</outputDirectory>
  14.  
    <resources>
  15.  
    <resource>
  16.  
    <directory>src/main/resources</directory>
  17.  
    <!-- 指定不需要处理的资源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> -->
  18.  
    <excludes> <exclude>**/*.xml</exclude> </excludes>
  19.  
    <filtering>true</filtering>
  20.  
    </resource>
  21.  
    </resources>
  22.  
    </configuration>
  23.  
    </execution>
  24.  
    </executions>
  25.  
    </plugin>

实现的效果如下:

编译好之后,会在target目录下生成conf目录并且把resources目录下的所有文件都自动拷贝到target/conf/目录下

Maven学习笔记(十二)-maven打包之resource配置的更多相关文章

  1. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  2. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  3. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  4. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  5. Maven 学习笔记(二)

    前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...

  6. maven学习(十二)——maven聚合与继承实战

    聚合与继承实战 创建四个Maven项目,如下图所示:

  7. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  8. Maven学习笔记(三) :Maven使用入门

    编写POM:      Maven项目的核心是pom.xml.POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描写叙述项目怎样构建,声明项目依赖,等等.   ...

  9. maven学习(十)——maven生命周期以及插件

    一.生命周期 1.何为生命周期? Maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,打包,测试,部署等几乎所有构建步骤 2.Maven三大生命周期 Maven有三套 ...

随机推荐

  1. webvtt字幕转srt字幕的python程序(附改名程序)

    最近写了两个比较简单的python程序,原有都是由于看公开课感觉比较费劲,一个是下载的视频无用的名字太长,另一个就是下载的vtt字幕播放器不识别,写了一个vtt转换成str字幕格式的文件 vtt to ...

  2. docker之docker-machine用法

    转自:https://www.cnblogs.com/jsonhc/p/7784466.html docker-machine 是docker官方提供的docker管理工具.通过docker-mach ...

  3. python 叠加装饰器详解

    def out1(func1): #7.func1=in2的内存地址,就是in2 print('out1') def in1(): #8.调用函数index() 因为函数在in1里,所以首先运行in1 ...

  4. 使用exec函数将当前的信息输入到文件中

    先来看看exec函数: exec函数族     fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函 ...

  5. 【deep learning】斯坦福CS231n—深度学习与计算机视觉(资料汇总)

    官网 链接:CS231n: Convolutional Neural Networks for Visual Recognition Notes: 链接:http://cs231n.github.io ...

  6. UI简单工作

     UI用户界面 需求——效果图——风格设计——高保证效果——html 网页的宽度=屏幕的宽度-纵向滚动条的宽度 企业网站一般是1280 根据百度流量研究所 目前我们的网页注主要是1024和1200   ...

  7. 无法加载ISAPI 筛选器 当前配置只支持加载为 AMD64 处理器体系结构创建的映像

    无法加载ISAPI 筛选器 当前配置只支持加载为 AMD64 处理器体系结构创建的映像 2011-11-9 0:18:49来源:本站原创作者:清晨320我要评论(0) 今天服务器的伪静态死活加载不上去 ...

  8. 学JS的心路历程 -数组常见处理方法

    昨天我们有提到说for-of和forEach可以用来处理数组,但其实还有很多方法可以更快速及精简代码的达到你要的效果. 话不多说,我们赶紧来看吧! Array.prototype.map() 会回传一 ...

  9. BOS物流项目第十二天

    教学计划 1.角色管理 a.  添加角色功能 b.  角色分页查询 2.用户管理 a.  添加用户功能 b.  用户分页查询 3.修改Realm中授权方法(查询数据库) 4.使用ehcache缓存权限 ...

  10. linux 基本操作centos7

    基于centos7  ,很多都跟6不同 Centos 7 firewall 命令: 查看已经开放的端口:firewall-cmd --list-ports 开启端口firewall-cmd --zon ...