我有一个打包在 EAR 文件中并部署在 WildFly 9.0.2 Final 上的应用程序。它需要读取 WildFly 定义的一些系统属性。
问题是 EAR 中的类无法读取 WildFly 系统属性。例如 - 以下代码获取 NullPointerException:
String DEPLOY_DIR = System.getProperty("jboss.server.base.dir") + File.separator + "deployments"
File deployDir = new File(DEPLOY_DIR);
这是错误:
java.lang.NullPointerException
at java.io.File.<init>(File.java:277)
错误发生是因为以下返回空值:
System.getProperty("jboss.server.base.dir")
请注意,当 WildFly 启动时,其相关系统属性会在其日志中正确显示:
jboss.server.base.dir = C:\javaSoft\workspaces\WildFly_Migration\App\configuration\wildfly-9.0.2.Final\standalone
jboss.server.config.dir = C:\javaSoft\workspaces\WildFly_Migration\App\configuration\wildfly-9.0.2.Final\standalone\configuration
jboss.server.data.dir = C:\javaSoft\workspaces\WildFly_Migration\App\configuration\wildfly-9.0.2.Final\standalone\data
jboss.server.deploy.dir = C:\javaSoft\workspaces\WildFly_Migration\App\configuration\wildfly-9.0.2.Final\standalone\data\content
jboss.server.log.dir = C:\javaSoft\workspaces\WildFly_Migration\App\configuration\wildfly-9.0.2.Final\standalone\log
我的问题 - EAR 无法读取任何系统属性是否有任何原因?
最佳答案
我首先要说的是,在大型系统中,很难诊断出这些问题。
在 JVM 中,系统属性是共享的,您应该始终看到相同的值,正如 Wildfly9 文档在警告您 Property Replacement 的风险时确认的那样
System properties etc are resolved in the security context of the application server itself, not the deployment that contains the file.
所以答案应该是否定的:EAR 可以读取所有系统属性,因为您没有收到 SecurityException(这排除了您在安全上下文中运行并且它正在阻塞的事实你)。
无论如何,您可能需要检查一些情况,例如:
- 您的一段代码在删除该值的另一段代码之后运行。您可以使用环境变量 $JBOSS_HOME 解决这些问题。
- 您的 DEPLOY_DIR 是一个静态常量(在这种情况下,它可以在 Wildfly 设置 jboss.server.base.dir 之前进行评估)。您可以使用由 standalone.sh 直接创建的“jboss.home.dir”键解决这个问题。
- 您的代码在静态 { ... } 初始化 block 中运行。如果是这种情况,在其中使用“新文件”是一种不好的做法,但如果不是,您可以按照情况 2 解决。
关于java - 无法读取 WildFly 系统属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767754/