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

2022-08-23 18:52:47 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

一、简介

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

代码语言:javascript复制
● src/main/java和src/test/java 

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

代码语言:javascript复制
● src/main/resouces和src/test/resources

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

代码语言:javascript复制
● 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目录下

代码语言:javascript复制
    <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来实现。

代码语言:javascript复制
            <!--
                    此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传入属性的值,以实现更为灵活的构建。

代码语言:javascript复制
<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插件

代码语言:javascript复制
  <!--
        此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文件不被打包,可通过如下配置:

代码语言:javascript复制
	<!--过滤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>

编译之后如下:

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

代码语言:javascript复制
    <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/目录下

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139205.html原文链接:https://javaforall.cn

0 人点赞