这里是我的项目加载特性从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