一、簡介
構(gòu)建Maven項目的時候,如果沒有進行特殊的配置,Maven會按照標準的目錄結(jié)構(gòu)查找和處理各種類型文件。
● src/main/java和src/test/java
這兩個目錄中的所有*.java文件會分別在comile和test-comiple階段被編譯,編譯結(jié)果分別放到了target/classes和targe/test-classes目錄中,但是這兩個目錄中的其他文件都會被忽略掉。
● src/main/resouces和src/test/resources 這兩個目錄中的文件也會分別被復制到target/classes和target/test-classes目錄中。
● target/classes
打包插件默認會把這個目錄中的所有內(nèi)容打入到j(luò)ar包或者war包中。
如下所示:
二、Maven項目的標準目錄結(jié)構(gòu)
- src
- main
- java 源文件
- resources 資源文件
- filters 資源過濾文件
- config 配置文件
- scripts 腳本文件
- webapp web應(yīng)用文件
- 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能把這些資源文件打包到相應(yīng)的jar或者war里。
有時候,比如mybatis的mapper.xml文件,我們習慣把它和Mapper.java放一起,都在src/main/java下面,這樣利用maven打包時,就需要修改pom.xml文件,來把mapper.xml文件一起打包進jar或者war里了,否則,這些文件不會被打包的。(maven認為src/main/java只是java的源代碼路徑)
下面通過一個簡單的示例來說明:
項目結(jié)構(gòu)如下所示,有兩個UserMaper.xml文件,所在目錄不同
默認情況下,在POM.XML目錄下執(zhí)行: mvn clean package 打包命令在target\classes目錄下不會把UserMapper.xml打包到下mapper目錄下
而resources目錄下的文件始終都會打包進jar包或war包
這個時候使用mybatis就會出一些問題,找不到UserMapper所對應(yīng)的xml文件解決方法有如下幾種:
(1)配置POM.XML的resource把xml也打包到mapper目錄下
<directory>src/main/java</directory> <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標處理主資源目下的資源文件時,只處理如下配置中包含的資源類型 --> <include>**/*.xml</include> <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標處理主資源目下的資源文件時,不處理如下配置中包含的資源類型(剔除下如下配置中包含的資源類型)--> <exclude>**/*.yaml</exclude> <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標處理主資源目下的資源文件時,指定處理后的資源文件輸出目錄,默認是${build.outputDirectory}指定的目錄--> <!--<targetPath>${build.outputDirectory}</targetPath> --> <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標處理主資源目下的資源文件時,是否對主資源目錄開啟資源過濾 --> <filtering>true</filtering>
其中**/*這樣的寫法,是為了保證各級子目錄下的資源文件被打包。resources是可以看做是容器,這個容器里面可以放很多個像resource這樣的配置。而directory就是配置文件所在的路徑,includes從英文單詞角度看,就是包含的意思,此時在執(zhí)行命令,就會把xml也打包到mapper目錄下了
Resources官方文檔地址為:http://maven./pom.html#Resources
(2)maven-resources-plugin插件
為了使項目結(jié)構(gòu)更為清晰,Maven區(qū)別對待Java代碼文件和資源文件,maven-compiler-plugin用來編譯Java代碼,maven-resources-plugin則用來處理資源文件。
默認的主資源文件目錄是src/main/resources,很多用戶會需要添加額外的資源文件目錄,這個時候就可以通過配置maven-resources-plugin來實現(xiàn)。
利用此plugin,把源代碼中的xml文件,打包到相應(yīng)位置, 這里主要是為了打包Mybatis的mapper.xml文件 <artifactId>maven-resources-plugin</artifactId> <phase>process-sources</phase> <goal>copy-resources</goal> <outputDirectory>${basedir}/target/classes</outputDirectory> <directory>${basedir}/src/main/java</directory> <include>**/*.xml</include>
此外,資源文件過濾也是Maven的一大特性,你可以在資源文件中使用${propertyName}形式的Maven屬性,然后配置maven-resources-plugin開啟對資源文件的過濾,之后就可以針對不同環(huán)境通過命令行或者Profile傳入屬性的值,以實現(xiàn)更為靈活的構(gòu)建。
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <encoding>UTF-8</encoding> <!-- 過濾后綴為pem、pfx的證書文件 --> <nonFilteredFileExtensions> <nonFilteredFileExtension>pem</nonFilteredFileExtension> <nonFilteredFileExtension>pfx</nonFilteredFileExtension> <nonFilteredFileExtension>p12</nonFilteredFileExtension> </nonFilteredFileExtensions>
(3)build-helper-maven-plugin插件
打包到相應(yīng)位置,這里主要是為了打包Mybatis的mapper.xml文件 <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <phase>generate-resources</phase> <goal>add-resource</goal> <directory>src/main/java</directory> <include>**/*.xml</include>
3.2、src/main/resources目錄下的xml等資源文件不被打包
默認resources目錄下的文件都會被打包,如果想resources目錄下的xml文件不被打包,可通過如下配置:
<directory>src/main/resources</directory> <include>*.properties</include> <!--打包properties文件--> <exclude>*.xml</exclude> <!--過濾xml與yaml文件--> <exclude>*.yaml</exclude>
編譯之后如下:
當然也可以通過插件來實現(xiàn)
<artifactId>maven-resources-plugin</artifactId> <goal>copy-resources</goal> <!-- 并把文件復制到target/conf目錄下--> <outputDirectory>${project.build.directory}/conf</outputDirectory> <directory>src/main/resources</directory> <!-- 指定不需要處理的資源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> --> <excludes> <exclude>**/*.xml</exclude> </excludes> <filtering>true</filtering>
實現(xiàn)的效果如下:
編譯好之后,會在target目錄下生成conf目錄并且把resources目錄下的所有文件都自動拷貝到target/conf/目錄下
參考: https://www.cnblogs.com/pixy/p/4798089.html
|