2015-09-24 41 views
1

應用程序結構描述:帶有ejb模塊(.jar),jboss-seam(.jar)和war模塊(.war)的Ear應用程序。Jboss 7 getResourcesAsStream()

我有一個StartupAction.class(seam組件)註釋org.jboss.seam.annotations.Startup。在應用程序部署我需要從application.war模塊根(application.war /頁/ page.xhtml)和WEB-INF/classesapplication.war/WEB-INF /班/ file.properties

獲取資源
  • 的Jboss 4.2 Thread.currentThread().getContextClassLoader().getResourceAsStream("file.properties")將從application.war/WEB-INF /班/ file.properties獲取文件。

  • 的Jboss 7.1.1
    代碼從上面不與JBoss 7.工作

我知道類負載的變化,但我無法弄清楚如何獲得到application.war in jboss 7.

可以做到這一點嗎?有沒有這樣的例子?

在此先感謝。

+0

「StartupAction」本身在哪裏? EAR/EJB模塊首先不應該能夠從WAR訪問資源,也不能使用它的依賴關係。這只是另一回事。 – BalusC

+0

'StartupAction'位於_company .... action_package的application.jar中。所有的課程都在那裏。在啓動時,它調用一個'StartupService',它負責獲取文件並將屬性導入到數據庫中。我正在將seam應用程序從jboss 4遷移到jboss 7.如果有另一種方法可以執行此操作(在啓動時獲取文件),我可以重新實現它。 – jzoric

+0

在EAR/EJB模塊中。 – jzoric

回答

2

正如@BalusC提到的,你將無法讀取性能文件嵌入在EAR中打包的任何其他模塊(EJB或其他)中的Web模塊中。

這在JBoss 4.x中起作用的事實是它爲甚至更早版本的JBoss提供向後兼容性的結果。 JBoss 4.x中需要額外的配置才能使用符合規範的類加載。 JBoss 7.x和更新的使用規範的類加載默認情況下。

如果您的屬性文件包含旨在部署之後可訪問的外部配置,那麼您可以考慮How to put an external file in the classpath中描述的方法。

但是,如果它是有效的靜態數據,那麼您應該將屬性文件打包到jar模塊中,並將其放在EAR的lib目錄中。

+0

我將我的屬性打包成jar文件,並將其移至application.ear/lib文件夾。在'StartupAction'代碼中,Thread.currentThread()。getContextClassLoader()。getResourceAsStream(file.properties)'現在可以工作。 我相信這將是一個可以接受的解決方案。 – jzoric

0

在jboss7中,每個子部件都有一個類加載器。

在你的情況下,Thread.currentThread().getContextClassLoader()將返回當前部署的類加載器。

要解決你的問題,你可以試試這個: SomeRandomClassContainedInsideTheWAR.class.getClassLoader()

查閱本指南,以瞭解更多有關JBoss7的ClassLoader https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

+0

問題是我沒有戰爭類。我所有的類都在application-ejb.jar模塊中。 我在戰爭模塊中有一個類沒有使用,我在那裏試過SomeRandomClassContainedInsideTheWAR.class.getClassLoader()。getResources(...)沒有工作。它返回null。 – jzoric

+0

您是否使用'「/file.properties」或'「/WEB-INF/classes/file.properties」'而不是「file.properties」來嘗試? – Ozwizard

+0

是的。返回'null'。 – jzoric