2016-01-13 140 views
1

我有一個打包在EAR文件中並部署在WildFly 9.0.2 Final上的應用程序。它需要讀取由WildFly定義的一些系統屬性。無法讀取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是否有任何理由不能讀取任何系統屬性?

+0

您的代碼讀取系統道具在哪裏?並在什麼時候執行?它可能是靜態初始化器的一部分嗎? – ctomc

+1

你確定這段代碼正在執行嗎?如果你的屬性是'null','DEPLOY_DIR'應該是'null \ deployments' – user140547

回答

1

我開始說在大型系統中,很難診斷這些問題。

在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(它排除了您在安全上下文中運行並且阻止您的事實)。

不管怎麼說,可能有一些情況下,你應該檢查,如:

  1. 你的一段代碼的其它部分的代碼,刪除值之後運行。您可以使用環境變量$ JBOSS_HOME解決這些問題。
  2. 您的DEPLOY_DIR是一個靜態常量(在這種情況下,可以在Wildfly設置jboss.server.base.dir之前對其進行評估)。您可以使用由standalone.sh直接創建的「jboss.home.dir」鍵來解決此問題。
  3. 您的代碼在靜態{...}初始化塊內運行。如果是這種情況,那麼在內部使用「新文件」是一種不好的做法,但如果沒有,您可以將其作爲案例2解決。