问题概述:
前几天遇到一个问题,我们的项目有自己开发的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>
本博客属于个人工作中遇到的问题总结,如果写的有不到位的地方,望批评指教,谢谢!