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

2023-02-14,,,,

版权声明:本文为博主原创文章,未经博主允许不得转载。 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目录下

     

    <build>

     

    <!-- 资源目录 -->

     

    <resources>

     

    <resource>

     

    <!-- 设定主资源目录 -->

     

    <directory>src/main/java</directory>

     
     
     

    <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->

     

    <includes>

     

    <include>**/*.xml</include>

     

    </includes>

     
     
     

    <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->

     

    <excludes>

     

    <exclude>**/*.yaml</exclude>

     

    </excludes>

     
     
     

    <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->

     

    <!--<targetPath>${build.outputDirectory}</targetPath> -->

     
     
     

    <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->

     

    <filtering>true</filtering>

     

    </resource>

     

    </resources>

     

    </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来实现。

     

    <!--

     

    此plugin可以用

     

    利用此plugin,把源代码中的xml文件,打包到相应位置,

     

    这里主要是为了打包Mybatis的mapper.xml文件

     

    -->

     

    <plugin>

     

    <artifactId>maven-resources-plugin</artifactId>

     

    <version>2.5</version>

     

    <executions>

     

    <execution>

     

    <id>copy-xmls</id>

     

    <phase>process-sources</phase>

     

    <goals>

     

    <goal>copy-resources</goal>

     

    </goals>

     

    <configuration>

     

    <outputDirectory>${basedir}/target/classes</outputDirectory>

     

    <resources>

     

    <resource>

     

    <directory>${basedir}/src/main/java</directory>

     

    <includes>

     

    <include>**/*.xml</include>

     

    </includes>

     

    </resource>

     

    </resources>

     

    </configuration>

     

    </execution>

     

    </executions>

     

    </plugin>

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

     

    <plugin>

     

    <groupId>org.apache.maven.plugins</groupId>

     

    <artifactId>maven-resources-plugin</artifactId>

     

    <configuration>

     

    <encoding>UTF-8</encoding>

     

    <!-- 过滤后缀为pem、pfx的证书文件 -->

     

    <nonFilteredFileExtensions>

     

    <nonFilteredFileExtension>pem</nonFilteredFileExtension>

     

    <nonFilteredFileExtension>pfx</nonFilteredFileExtension>

     

    <nonFilteredFileExtension>p12</nonFilteredFileExtension>

     

    </nonFilteredFileExtensions>

     

    </configuration>

     

    </plugin>

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

     

    <!--

     

    此plugin可以用

     

    利用此plugin,把源代码中的xml文件,

     

    打包到相应位置,这里主要是为了打包Mybatis的mapper.xml文件

     

    -->

     

    <plugin>

     

    <groupId>org.codehaus.mojo</groupId>

     

    <artifactId>build-helper-maven-plugin</artifactId>

     

    <version>1.8</version>

     

    <executions>

     

    <execution>

     

    <id>add-resource</id>

     

    <phase>generate-resources</phase>

     

    <goals>

     

    <goal>add-resource</goal>

     

    </goals>

     

    <configuration>

     

    <resources>

     

    <resource>

     

    <directory>src/main/java</directory>

     

    <includes>

     

    <include>**/*.xml</include>

     

    </includes>

     

    </resource>

     

    </resources>

     

    </configuration>

     

    </execution>

     

    </executions>

     

    </plugin>

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

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

     

    <!--过滤resource下的文件-->

     

    <resources>

     

    <resource>

     

    <directory>src/main/resources</directory>

     

    <includes>

     

    <include>*.properties</include> <!--打包properties文件-->

     

    </includes>

     

    <excludes>

     

    <exclude>*.xml</exclude> <!--过滤xml与yaml文件-->

     

    <exclude>*.yaml</exclude>

     

    </excludes>

     

    </resource>

     

    </resources>

编译之后如下:

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

     

    <plugin>

     

    <artifactId>maven-resources-plugin</artifactId>

     

    <executions>

     

    <execution>

     

    <id>copy-resources</id>

     

    <phase>validate</phase>

     

    <goals>

     

    <goal>copy-resources</goal>

     

    </goals>

     

    <configuration>

     
     
     

    <!-- 并把文件复制到target/conf目录下-->

     

    <outputDirectory>${project.build.directory}/conf</outputDirectory>

     

    <resources>

     

    <resource>

     

    <directory>src/main/resources</directory>

     

    <!-- 指定不需要处理的资源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> -->

     

    <excludes> <exclude>**/*.xml</exclude> </excludes>

     

    <filtering>true</filtering>

     

    </resource>

     

    </resources>

     

    </configuration>

     

    </execution>

     

    </executions>

     

    </plugin>

实现的效果如下:

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

Maven学习笔记(十二)-maven打包之resource配置的相关教程结束。

《Maven学习笔记(十二)-maven打包之resource配置.doc》

下载本文的Word格式文档,以方便收藏与打印。