maven打包额外的资源文件
在用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>
"可是怎么办好呢,看到你难过的时候我还是会心疼。"