JBoss 7.2部署后无法读取Maven生成的构建时间戳属性文件如何解决
问题根因
你当前遇到的报错核心原因是读取资源的方式错误:
src/main/resources是Maven项目的源码目录,仅存在于开发环境,不会被打包到最终部署的应用包中- 构建打包后,
src/main/resources下的资源文件会被自动拷贝到应用类路径根目录(Web应用对应WEB-INF/classes路径),部署到JBoss后的服务器环境不存在源码目录结构,因此用FileInputStream读固定源码路径必然抛出FileNotFoundException
解决方案1:修改为类路径读取资源(推荐)
这是最适配当前配置的方案,不需要修改现有打包逻辑,仅调整Java读取代码,同时确认Maven资源过滤配置即可:
第一步:修改资源读取代码
改用类加载器读取类路径下的version.properties:
try (InputStream properties = Thread.currentThread().getContextClassLoader().getResourceAsStream("version.properties")) { // 先判断流是否为空,避免空指针 if (properties == null) { throw new RuntimeException("类路径下未找到version.properties文件"); } Properties prop = new Properties(); prop.load(properties); // 后续正常读取version、build.date属性即可 }
第二步:确认POM资源过滤配置
确保pom.xml中开启了对应资源的过滤,保证占位符正常替换:
<build> <resources> <!-- 仅对version.properties开启过滤,避免影响其他不需要替换占位符的资源或二进制文件 --> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>version.properties</include> </includes> </resource> <!-- 其他资源关闭过滤 --> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>version.properties</exclude> </excludes> </resource> </resources> </build>
解决方案2:将构建信息写入MANIFEST.MF(无额外配置文件)
如果不想单独维护属性文件,也可以直接通过Maven插件把构建信息打到应用包的MANIFEST.MF文件中,直接读取清单文件的属性即可:
第一步:配置Maven WAR插件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> <configuration> <archive> <manifestEntries> <Implementation-Version>${pom.version}</Implementation-Version> <Build-Date>${timestamp}</Build-Date> </manifestEntries> </archive> </configuration> </plugin>
第二步:读取MANIFEST.MF属性
try (InputStream manifestStream = getClass().getProtectionDomain().getCodeSource().getLocation().openStream()) { Manifest manifest = new Manifest(manifestStream); Attributes attrs = manifest.getMainAttributes(); String version = attrs.getValue("Implementation-Version"); String buildDate = attrs.getValue("Build-Date"); }
其他说明
你之前考虑的standalone.xml方案不适用:该文件是JBoss服务器的全局配置,不属于你的应用部署包,构建阶段无法对其进行占位符替换,且将应用专属的构建信息放到服务器全局配置会产生不必要的耦合,不推荐使用。
内容的提问来源于stack exchange,提问作者Noel93
相关产品推荐
相关产品推荐

