首先,道歉重复一个常见问题的变体。但是,我正在努力理解这里的最佳方法。我有一个使用Hibernate和Glassfish 3的应用程序。与其他人一样,我希望能够从war文件外部加载Hibernate属性。我设法开展工作的唯一解决方案如下。它从domains/domain1/config文件夹加载属性。使用ServletContext读取来自外部战争的Hibernate属性
private Properties getLocalHibernateProperties() {
Properties properties = new Properties();
try {
File pf = new File(System.getProperty("user.dir"), PROPERTIES_FILE_NAME);
InputStream inStream = new FileInputStream(pf);
properties.load(inStream);
}
catch (Exception e) {
e.printStackTrace();
}
return properties;
}
但是,我也发现并使用ServletContext的例子How to read properties file placed outside war?。结合各部分:
in web.xml <listener-class>foo.bar.startup.HibernatePropertiesLoader</listener-class>
public class HibernatePropertiesLoader implements ServletContextListener {
public void contextInitialized(ServletContextEvent event){
ServletContext context = event.getServletContext();
context.setAttribute("settings", new HibernatePropertiesReader(context));
}
public void contextDestroyed(ServletContextEvent event){}
}
public class HibernatePropertiesReader {
ServletContext ctx = null;
public HibernatePropertiesReader(ServletContext ctx) {
this.ctx = ctx;
}
public Properties getLocalHibernateProperties() {
Properties properties = new Properties();
try {
InputStream inStream = ctx.getResourceAsStream(PROPERTIES_FILE);
properties.load(inStream);
}
catch (Exception e) {
e.printStackTrace();
}
return properties;
}
}
我可以理解,第二个解决方案将搜索的Servlet CLASSPATH - (这是正确的?),比我原来的解决方案,因此更加灵活。但是,我不明白如何使用(访问)我的HibernateUtils类的属性。我猜,这意味着有一些基本的东西丢失在我的ServletContext的理解....
任何援助,咨询,更好的解决方案赞赏...
因此,ServletContext不适合从应用程序外部加载“特定于安装的”属性?这让我感到震惊,第一个解决方案可能不够灵活 - 也许我错了。 – skyman 2012-04-03 15:00:11
将上下文根目录中的特定安装属性置于什么位置?你是否建议将它们放在用户的主目录中?单个用户可以在不同的端口上运行同一应用程序的多个实例。 – Pace 2012-04-04 04:17:11
我想我正试图解决一个问题,我需要升级站点的WAR而不替换本地配置数据。我是否正确地说在上下文中根目录实际上是在未打包的WAR中? – skyman 2012-04-04 04:29:02