在用Maven打包的時候發現,有一些資源文件打包不到jar包中,於是了解了一下Maven的打包配置,最后得到了解決問題的辦法。
Maven資源文件的默認約定
構建Maven項目的時候,如果沒有進行特殊的配置,Maven會按照標准的目錄結構,去查找和處理各種類型的文件,這就是Maven遵循的約定優於配置原則。
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
src/main/java和src/test/java
這兩個目錄中的所有*.java文件會分別在compile和test-compile階段被編譯,編譯的結果會被分別放到target/classes和target/test-classes目錄中,但是這兩個目錄中的其他非*.java的文件都會被忽略掉。
src/main/resouces和src/test/resources
這兩個目錄中的文件也是會被分別復制到target/classes和target/test-classes目錄中。
target/clasess
打包插件默認會把這個目錄中的所有內容打入到jar包或者war包中。
Maven打額外資源文件的配置
資源文件是Java代碼中要使用的文件,代碼在執行的時候會到指定目錄去查找這些文件。一般情況下,我們用到的資源文件(各種xml,properties,xsd文件等)都放在src/mian/resources下,利用Maven打包的時候,Maven都能默認將這些資源文件打包到相應的jar包或者war包中。
但是有些時候,可能會把資源文件放到src/main/java下,比如說Mybatis的Mapper.xml文件就是和Mapper.java放在一起,也就導致了java文件能打到jar包中,Mapper.xml卻沒有打進jar包中。這時候,就需要在pom.xml中添加特定的配置來將這些資源文件能打進jar包或war包中。
配置有兩種方法,一是在<build>標簽節點下添加<resources>標簽節點,二是在<build>標簽節點下的<plugins>標簽節點中配置maven-resources-plugin等處理資源文件的插件。
<resources>標簽
<build> ....... <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>**/*.properties</exclude> <exclude>**/*.xml</exclude> </excludes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> ...... </build>
maven-resources-plugin插件
<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>
build-helper-maven-plugin插件
<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>
Maven排除資源文件的配置
前面說了,target/classes目錄中的資源文件會全部和class字節碼一起被打進jar包或war包中。這樣,當你希望有一些文件不被打包的時候,就需要額外去配置maven-jar-plugin插件了。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <excludes> <exclude>*.properties</exclude> </excludes> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.yanggb.main.HelloWorld</mainClass> </manifest> </archive> </configuration> </plugin>
"可是怎么辦好呢,看到你難過的時候我還是會心疼。"