Maven <resource>标签

一、简介


构建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. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
  8. <includes>
  9. <include>**/*.xml </include>
  10. </includes>
  11. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->
  12. <excludes>
  13. <exclude>**/*.yaml </exclude>
  14. </excludes>
  15. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->
  16. <!--<targetPath>${build.outputDirectory}</targetPath> -->
  17. <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
  18. <filtering>true </filtering>
  19. </resource>
  20. </resources>
  21. </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. <!-- 并把文件复制到target/conf目录下-->
  12. <outputDirectory>${project.build.directory}/conf </outputDirectory>
  13. <resources>
  14. <resource>
  15. <directory>src/main/resources </directory>
  16. <!-- 指定不需要处理的资源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> -->
  17. <excludes> <exclude>**/*.xml </exclude> </excludes>
  18. <filtering>true </filtering>
  19. </resource>
  20. </resources>
  21. </configuration>
  22. </execution>
  23. </executions>
  24. </plugin>

实现的效果如下:



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


参考: https://www.cnblogs.com/pixy/p/4798089.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值