如何从JBoss属性文件取值并访问指定路径的配置文件?
咱们先来梳理下你遇到的两个核心需求:一是正确读取src/main/resources/OSGI-INF/app.properties这个属性文件,二是在JBoss环境下获取属性值。我分两部分给你说清楚解决方案:
一、正确读取Classpath下的属性文件
你原来的代码用FileReader直接指定路径,在IDE里跑可能没问题,但部署到JBoss后肯定会报错——因为打包后的应用里,src/main/resources下的文件会被放到Classpath根目录,不存在物理的src/main/resources路径了。正确的做法是用类加载器来读取资源流:
protected void sss() { // 注意路径要去掉前面的src/main/resources,直接用Classpath下的相对路径 try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("OSGI-INF/app.properties")) { if (is == null) { throw new FileNotFoundException("app.properties 未在Classpath的OSGI-INF目录下找到"); } Properties pro = new Properties(); pro.load(is); String url = pro.getProperty("ConfirmProductMasterDataStatus"); // 这里可以添加对url的后续业务处理 } catch (FileNotFoundException e) { e.printStackTrace(); // 建议换成日志框架记录错误,而不是直接打印堆栈 } catch (IOException e) { e.printStackTrace(); } }
这里几个关键要点:
getResourceAsStream的参数是Classpath下的相对路径,因为src/main/resources会被编译到Classpath根目录,所以直接写OSGI-INF/app.properties就行- 用
try-with-resources语法自动关闭输入流,避免资源泄漏 - 增加了
is == null的判断,提前捕获资源不存在的情况,避免后续load时出现空指针异常
二、JBoss环境下获取属性值的几种方式
如果你的需求是从JBoss自身的配置中获取属性值(比如standalone.xml或domain.xml里的配置),可以根据不同场景选择以下方式:
1. 读取JBoss系统属性(最常用)
如果属性已经配置在JBoss的系统属性里(比如在standalone.xml中添加了<system-property name="ConfirmProductMasterDataStatus" value="你的属性值"/>),直接用System.getProperty就能获取:
// 直接获取,找不到会返回null String url = System.getProperty("ConfirmProductMasterDataStatus"); // 可以添加默认值,避免null String url = System.getProperty("ConfirmProductMasterDataStatus", "默认值");
2. 读取JBoss配置文件中的自定义节点属性
如果属性是放在JBoss配置文件的自定义节点里,需要用JBoss的ModelControllerClient API来读取:
import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.dmr.ModelNode; import java.io.IOException; import java.net.InetAddress; public String getJBossCustomProperty() throws IOException { // 连接JBoss的管理端口(默认是9990) try (ModelControllerClient client = ModelControllerClient.Factory.create( InetAddress.getByName("localhost"), 9990)) { ModelNode operation = new ModelNode(); operation.get("operation").set("read-resource"); // 根据你的属性所在的配置路径调整,比如读取系统属性的路径是/system-property=ConfirmProductMasterDataStatus operation.get("address").add("system-property", "ConfirmProductMasterDataStatus"); ModelNode result = client.execute(operation); if (result.has("result") && result.get("result").has("value")) { return result.get("result").get("value").asString(); } return null; } }
注意:这种方式需要引入JBoss的jboss-as-controller-client依赖,并且要确保JBoss的管理端口对外开放。
3. 混合模式:优先从JBoss系统属性读取, fallback到自身资源文件
如果希望优先使用JBoss配置的属性,找不到再从自己的app.properties读取,可以这样写:
protected void sss() { String url = System.getProperty("ConfirmProductMasterDataStatus"); // 如果JBoss系统属性里没有,再从自身资源文件读取 if (url == null) { try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("OSGI-INF/app.properties")) { if (is != null) { Properties pro = new Properties(); pro.load(is); url = pro.getProperty("ConfirmProductMasterDataStatus"); } } catch (IOException e) { e.printStackTrace(); } } // 后续处理url }
内容的提问来源于stack exchange,提问作者Sameera Athukorala

