• Maven学习笔记(十二)-maven打包之resource配置


    版权声明:本文为博主原创文章,未经博主允许不得转载。 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 打包命令在targetclasses目录下不会把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/目录下

  • 相关阅读:
    【bzoj4596】[Shoi2016]黑暗前的幻想乡 容斥原理+矩阵树定理
    【bzoj4832】[Lydsy1704月赛]抵制克苏恩 期望dp
    【bzoj3796】Mushroom追妹纸 hash/sa+kmp+二分
    【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛
    【bzoj2813】 奇妙的Fibonacci数列 线性筛
    面向对象实现简单的学生课程选择
    小案例--面向对象中实现分页
    初识面向对象四(装饰器/反射)
    python小技巧--控制台输出带颜色的文字方法
    初识面向对象三(经典类/多态/鸭子类型/初识封装)
  • 原文地址:https://www.cnblogs.com/lykbk/p/45435344dsf.html
Copyright © 2020-2023  润新知