基本用法
构建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包中。
配置示例
<build>
<finalName>${project.parent.artifactId}-${project.version}</finalName>
<resources>
<!-- 所有profile共用的配置文件路径 -->
<resource>
<directory>src/main/resources/common</directory>
</resource>
<!-- 当前profile专用的配置文件路径 -->
<resource>
<directory>src/main/resources/${extra-resource-dir}</directory>
</resource>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
<includes>
<include>WEB-INF/web.xml</include>
</includes>
<targetPath>${project.build.directory}/${project.build.finalName}</targetPath>
</resource>
</resources>
</build>
<!-- 打包环境 -->
<profiles>
<!-- 本机开发环境 -->
<profile>
<id>dev</id>
<properties>
<extra-resource-dir>dev</extra-resource-dir>
</properties>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<extra-resource-dir>test</extra-resource-dir>
<oceanus.auth.rehearse>false</oceanus.auth.rehearse>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<extra-resource-dir>prod</extra-resource-dir>
</properties>
</profile>
</profiles>
当前配置在Web模块的pom文件里。执行mvn package -P dev 后把resource下common目录下里文件全部打包到target/class目录下,同时执行属性替换(如extra-resource-dir
取指定profile里的属性Key)后,把extra-resource-dir目录里的文件也全部打包到target/class目录下,如果存在相同目录则只复制文件。
源代码结构:
test-web (模块名,packing=war,version=1.0-SNAPSHOT)
--src
--main
--java
--resources
--common
--spring/spring_common.xml
--dev
--spring/spring_dev.xml
--test
--spring/spring_test.xml
--prod
--spring/spring_prod.xml
如打包命令为:mvn clean package -P dev 打包后:
test-web-1.0-SNAPSHOT
--META-INF
--WEB-INF
--web.xml
--lib(依赖的jar,工程内部的或三方外部的)
--classes(本模块java源代码编译后的class+打包后的资源文件)
--spring
--spring_common.xml
--spring_dev.xml
把common,dev目录下的资源都复制到classes目录下。
截图示例
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<resources>
<resource>
<directory>src/main/resources/spring</directory>
</resource>
<resource>
<directory>src/main/resources/${extra}</directory>
</resource>
</resources>
<pluginManagement>
</pluginManagement>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<extra>dev</extra>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<extra>prod</extra>
</properties>
</profile>
</profiles>
打包时资源文件的配置
默认打包资源文件
在每个模块里的pom.xml, 如果不配置额外插件或不单独定义resources标签,maven会把resource目录下的文件或目录全部打包到WEB-INF/classes目录里。
打包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的源代码路径)
配置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目录下了。
tatgetPath配置打包的war路径,默认为${build.outputDirectory}
,为项目根目录
Maven的默认配置变量如下:
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
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>
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/目录下.
参考原文链接
https://blog.csdn.net/u011781521/java/article/details/79052725