2

我有一个打包在 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)

发生错误是因为以下返回 null:

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 是否有任何理由无法读取任何系统属性?

4

1 回答 1

1

我首先要说的是,在大型系统中,很难诊断出这些问题。

在 JVM 中,系统属性是共享的,您应该始终看到相同的值,正如 Wildfly9 文档在警告您 属性替换的风险时确认的那样

系统属性等在应用程序服务器本身的安全上下文中解析,而不是包含文件的部署。

所以答案应该是否定的:EAR可以读取所有系统属性,因为您没有收到 SecurityException(这不包括您在安全上下文中运行并且它阻止您的事实)。

无论如何,您可能应该检查某些情况,例如:

  1. 您的一段代码在另一段删除该值的代码之后运行。您可以使用环境变量 $JBOSS_HOME 解决这些问题。
  2. 您的 DEPLOY_DIR 是一个静态常量(在这种情况下,可以在 Wildfly 设置 jboss.server.base.dir 之前对其进行评估)。您可以使用由standalone.sh 直接创建的“jboss.home.dir”键来解决这个问题。
  3. 您的代码在静态 { ... } 初始化块内运行。如果是这种情况,在其中使用“新文件”是一种不好的做法,但如果不是,您可以将其作为案例 2 来解决。
于 2016-01-14T17:00:10.813 回答