一、簡(jiǎn)介
構(gòu)建Maven項(xiàng)目的時(shí)候,如果沒有進(jìn)行特殊的配置,Maven會(huì)按照標(biāo)準(zhǔn)的目錄結(jié)構(gòu)查找和處理各種類型文件。
● src/main/java和src/test/java
這兩個(gè)目錄中的所有*.java文件會(huì)分別在comile和test-comiple階段被編譯,編譯結(jié)果分別放到了target/classes和targe/test-classes目錄中,但是這兩個(gè)目錄中的其他文件都會(huì)被忽略掉。
● src/main/resouces和src/test/resources
這兩個(gè)目錄中的文件也會(huì)分別被復(fù)制到target/classes和target/test-classes目錄中。● target/classes
打包插件默認(rèn)會(huì)把這個(gè)目錄中的所有內(nèi)容打入到j(luò)ar包或者war包中。
如下所示:
二、Maven項(xiàng)目的標(biāo)準(zhǔn)目錄結(jié)構(gòu)
3.1、打包src/main/java目錄下的xml
一般情況下,我們用到的資源文件(各種xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包時(shí),maven能把這些資源文件打包到相應(yīng)的jar或者war里。
有時(shí)候,比如mybatis的mapper.xml文件,我們習(xí)慣把它和Mapper.java放一起,都在src/main/java下面,這樣利用maven打包時(shí),就需要修改pom.xml文件,來(lái)把mapper.xml文件一起打包進(jìn)jar或者war里了,否則,這些文件不會(huì)被打包的。(maven認(rèn)為src/main/java只是java的源代碼路徑)
下面通過一個(gè)簡(jiǎn)單的示例來(lái)說(shuō)明:
項(xiàng)目結(jié)構(gòu)如下所示,有兩個(gè)UserMaper.xml文件,所在目錄不同
默認(rèn)情況下,在POM.XML目錄下執(zhí)行: mvn clean package 打包命令在target\classes目錄下不會(huì)把UserMapper.xml打包到下mapper目錄下
而resources目錄下的文件始終都會(huì)打包進(jìn)jar包或war包
這個(gè)時(shí)候使用mybatis就會(huì)出一些問題,找不到UserMapper所對(duì)應(yīng)的xml文件解決方法有如下幾種:
(1)配置POM.XML的resource把xml也打包到mapper目錄下
- <build>
- <!-- 資源目錄 -->
- <resources>
- <resource>
- <!-- 設(shè)定主資源目錄 -->
- <directory>src/main/java</directory>
- <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標(biāo)處理主資源目下的資源文件時(shí),只處理如下配置中包含的資源類型 -->
- <includes>
- <include>**/*.xml</include>
- </includes>
- <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標(biāo)處理主資源目下的資源文件時(shí),不處理如下配置中包含的資源類型(剔除下如下配置中包含的資源類型)-->
- <excludes>
- <exclude>**/*.yaml</exclude>
- </excludes>
- <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標(biāo)處理主資源目下的資源文件時(shí),指定處理后的資源文件輸出目錄,默認(rèn)是${build.outputDirectory}指定的目錄-->
- <!--<targetPath>${build.outputDirectory}</targetPath> -->
- <!-- maven default生命周期,process-resources階段執(zhí)行maven-resources-plugin插件的resources目標(biāo)處理主資源目下的資源文件時(shí),是否對(duì)主資源目錄開啟資源過濾 -->
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
Resources官方文檔地址為:http://maven.apache.org/pom.html#Resources
(2)maven-resources-plugin插件
為了使項(xiàng)目結(jié)構(gòu)更為清晰,Maven區(qū)別對(duì)待Java代碼文件和資源文件,maven-compiler-plugin用來(lái)編譯Java代碼,maven-resources-plugin則用來(lái)處理資源文件。
默認(rèn)的主資源文件目錄是src/main/resources,很多用戶會(huì)需要添加額外的資源文件目錄,這個(gè)時(shí)候就可以通過配置maven-resources-plugin來(lái)實(shí)現(xiàn)。
- <!--
- 此plugin可以用
- 利用此plugin,把源代碼中的xml文件,打包到相應(yīng)位置,
- 這里主要是為了打包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開啟對(duì)資源文件的過濾,之后就可以針對(duì)不同環(huán)境通過命令行或者Profile傳入屬性的值,以實(shí)現(xiàn)更為靈活的構(gòu)建。
- <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>
- <!--
- 此plugin可以用
- 利用此plugin,把源代碼中的xml文件,
- 打包到相應(yīng)位置,這里主要是為了打包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>
默認(rèn)resources目錄下的文件都會(huì)被打包,如果想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>
當(dāng)然也可以通過插件來(lái)實(shí)現(xiàn)
- <plugin>
- <artifactId>maven-resources-plugin</artifactId>
- <executions>
- <execution>
- <id>copy-resources</id>
- <phase>validate</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <!-- 并把文件復(fù)制到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>
編譯好之后,會(huì)在target目錄下生成conf目錄并且把resources目錄下的所有文件都自動(dòng)拷貝到target/conf/目錄下
參考: https://www.cnblogs.com/pixy/p/4798089.html
聯(lián)系客服