问题概述:
前几天遇到一个问题,我们的项目有自己开发的jar包,其中有个功能我希望从properties中读取文件的内容(资源文件的路径是/src/main/properties/zsc1/sys.properties),但是打完包(insatll命令)得到包放到环境之后,发现日志记录到了读取资源文件的代码部分报错,经查实打的jar包下面压根就没有我需要读取的资源文件,下面是解决前后的文件对照
开发工具:
IDEA-2016,打包命令如下图
排查思路:
1:先用了package的命令,解压看到是有资源文件的
2:看pom.xml中 package和install命令配置的不同,如下面代码,但是有install的这个插件的配置,却没有package的,我本来想进去看源码的,但是点进去之后,并未发现什么有价值的信息,所以继续查看pom.xml文件
<!-- install插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.4</version> </plugin>
然后又发现,有war,和jar相关的插件,发现新大陆,jar相关的jar包的位置,有个excludes的配置,里面有个log4j.properties的配置,我就在想也许我把自己需要加的路径配置就可以了,所以做了如下的尝试
<!-- war打包插件, 设定war包名称不带版本号 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <warName>${project.artifactId}</warName> </configuration> </plugin> <!-- jar打包相关插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest> </archive> <excludes> <exclude>log4j.properties</exclude> <!--TODO 这里是一会需要加的配置--> </excludes> </configuration> </plugin>
这一行代码放到上面的TODO的位置,这样写的原因是我项目的目录结构是这样定义的,如下图:
<exclude>**/*.properties</exclude>
,然后再次执行install命令的时候,就有资源文件了。
总结:
当遇到这个问题的时候我首先想的是难道jar包里面不支持资源文件的配置?但是想想也不应该啊,我们使用的很多的开源的jar包,都是有资源文件的呢。所以应该是自己命令的问题。
1:war包上面的配置项,并没有excludes的配置,war包install命令就是可以打出资源文件的,jar包的经试验,即使配置和war包保持一致,也是不会有资源文件的,所以应该跟本身的约定有关。
so:如果需要jar打出资源文件,就需要单独的去配置。
2:看了网上别的技术好友的,实验了下,发现这样写也是可以实现的
<build> <!--配置打包时不过滤非java文件开始 --> <!--说明,在进行模块化开发打jar包时,maven会将非java文件过滤掉, xml,properties配置文件等,但是这些文件又是必需的, 使用此配置可以在打包时将不会过滤这些必需的配置文件。 --> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> <!--配置打包时不过滤非java文件结束 --> </build>
本博客属于个人工作中遇到的问题总结,如果写的有不到位的地方,望批评指教,谢谢!