You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:21:00