這裏是我的項目加載特性從JAR文件中的文件,JSF
app > common-module > webapp-module > batch-module pom.xml
的common-module
暴露了Version
類的Maven的結構。這個類被webapp和批處理模塊使用。
Version
類有一個獨特的靜態方法,稱爲get
。它返回項目的全球版本。
全局版本存儲在屬性文件中。當從批處理模塊(獨立的Java應用程序)調用get
時,屬性文件已成功加載。
在web應用中,情況有所不同。我創建了一個託管bean VersionBean
,它允許任何JSF頁面調用get
方法。每當我使用以下其中一種方法時
FacesContext.getCurrentInstance().getExternalContext()
FacesContext.getCurrentInstance().getExternalContext().getContext()
Thread.currentThread().getClassLoader()
我永遠無法找到properties.file。
如何從託管bean加載位於jar文件中的屬性文件(getResourceAsStream)?
編輯
這裏是我想出了基於建議從@BalusC解決方案,並@eljunior
VersionBean.java
@ManagedBean(eager=true)
@ApplicationScoped
public class VersionBean {
private String version;
@PostConstruct
public void init(){
version = Version.get();
}
}
Version.java
public class Version {
public static String get() {
InputStream is = Version.class.getResourceAsStream("/version.properties");
// Read InputStream and return version string ...
}
}
謝謝你的解釋。我不知道這些方法的表現會如此不同。屬性文件的絕對位置如下:'/WEB-INF/lib/batch-module.jar!/ version.properties' – Stephan
'Thread.currentThread()。getContextClassLoader()。getResourceAsStream(「version.properties」 )'應該這樣做。 – BalusC
我很困惑。這*是*解決方案#2。 Eljunior的回答(基本上解決方案#3和我的答案一樣)假定它與類中的包相同,因爲你在JAR中的絕對位置似乎不是這種情況(因爲無包類是一種不好的做法) 。免責聲明:Maven超越了我,所以我無法從頭到尾判斷它是如何構建JAR和WAR的。 – BalusC