2012-03-27 70 views
4

這種需求可能聽起來有些複雜,如果是這樣,那麼我願意提供有關實施的最佳實踐的建議。我的問題是以下。我有一個WAR webapp,它包含在EAR中。一切都變得有些麻煩。從我的Web應用程序中,我試圖顯示耳朵的ID和耳朵的版本號以及戰爭。戰爭中的一個階級有沒有辦法從它的耳朵中訪問META-INF?

這場戰爭是一個相當容易處理的案例。我可以使用簡單的Maven過濾來將必要的artifactId/versionId注入到正在構建的戰爭中。然而,耳朵更復雜。

我知道有一個META-INF/maven /// pom.properties,我可以在包含該信息的耳朵中查看,但看不到它。我試過(從一個jsp頁面)以下沒有成功(所有有和沒有領先/);所有調用返回null:

getClass().getClassLoader().getResource("/META-INF/maven/<group>/<artifact>/pom.properties"); 
getClass().getClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties"); 

使用類加載器這甚至可行嗎?或者它是類加載器配置依賴?有沒有更好的方法來獲取這些信息?

我目前正在JBoss上運行測試,但最終的部署將在WebSphere上進行。不過,理想情況下,我想要一個不依賴於服務器的解決方案。

謝謝!

埃裏克

回答

5

我不相信這是可能的,因爲一個事實,即耳朵,EJB和戰爭是有不同的類加載器,這是沒有必要根據普遍的,可預見的和Java EE級方案相互鏈接。

最近,我遇到了類似的問題,我發現的唯一可接受的解決方案,在application.xml指定env-entry和@Resource注入閱讀它:在任何類

<application xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" 
      version="6"> 

    <!-- usual stuff goes here --> 
    <env-entry> 
    <description>application-wide property</description> 
    <env-entry-name>java:app/env/AppWideProperty</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>stackoverflow.com</env-entry-value> 
    </env-entry> 


</application> 

,稍後:

public class CalcResultCachePool { 
    @Resource(lookup="java:app/env/AppWideProperty") 
    String appWideProperty; 

    // 
    // 
} 
+0

感謝您的提示。這可以很好地工作,但是,我似乎無法使注射器正常工作。我正在JBoss 7.0.2上運行,但env-entry似乎並沒有被添加到jndi樹中。你成功運行過哪些服務器? – 2012-03-28 15:47:46

+0

忽略我最後的評論;在配置文件中遇到問題。現在一切正常。謝謝! – 2012-03-28 16:09:44

+0

不客氣,很樂意幫助 – Osw 2012-03-28 17:36:26

1

您是否嘗試過使用相關工件的ContextClassLoader?在web應用程序中,ContextClassLoader是從部署的應用程序的類路徑中檢索文件的首選方式。

Thread.currentThread().getContextClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties"); 

如果打包在兩個WAR文件,並在你的EAR的JAR文件的代碼,這可能會返回您取決於類加載器的正確信息。

聲明:這可能不適用於所有應用程序服務器,因爲某些應用程序服務器對Web應用程序使用統一的類加載器。

+0

感謝您的提示。我沒有嘗試使用基於線程的類加載器,因爲我正在尋找更通用的服務器。 @Osw有一個更通用的解決方案。 – 2012-03-28 16:10:45

相關問題