存储和编辑Java EE应用程序的配置

更新 :在撰写本文之后一年,请参阅我关于此主题的博客文章: http : //blog.ringerc.id.au/2012/07/java-ee-7-needs-improvements-in-app.html

…有关此主题的Java EE 7规划讨论的参考。


我主要编写了一个小型Java EE 6应用程序,并且正在使用适当的动态配置界面替换硬编码的首选项。

我不确定 – 或者更具体地说,在哪里 – 存储设置。 必须有一些明显的,“标准”的方式来做到这一点,预期“只是工作”跨越各种框架和容器,但对于我的生活,我找不到它。

我想要的是一种加载和存储设置的简单方法,一种适用于不同应用服务器和操作系统的设置,不需要用户进行任何配置,并且实际上正常工作 。 Java Preferences API是理想的 – 但在Glassfish 3.1下似乎已经破解了。

存储配置的选项理论上包括:

  1. 使用容器环境中的上下文参数
  2. 使用Java Preferences API存储它们
  3. 在某处读取/写入属性文件
  4. 使用JPA将它们存储在容器提供的JavaDB中
  5. 将它放在从类路径加载的属性文件中
  6. 使用系统属性设置配置选项或.properties文件的路径

这似乎是一个基本要求,在容器据称为您提供您可能需要的所有核心服务的环境中,这是一个很好的照顾 – 但所有这些方法都存在问题。

glassfish中的错误呈现(1)不可行,并且在任何情况下,Glassfish Web管理员用户界面都没有任何方法来配置上下文参数,因此您必须使用`asadmin’和一些不太可爱的命令行语法来执行此操作。 上下文参数只能通过ServletContext访问 – 在JSF2,JAX-RS和原始servlet等框架之间无法以一致的方式访问 – 但至少Seam Servlet处理它。

glassfish 中的 另一个错误 是已部署的app和Glassfish中断之间的库版本冲突 (2)。 首选项后端无法将首选项刷新到磁盘,因此重新启动应用程序服务器时,存储的首选项数据将丢失。 Java Preferences API似乎也被认为是J2SE /桌面的东西,尽管它包含在Java EE 6规范中。

(3)可能有效 – 但是没有办法知道你的应用程序在文件系统上的读/写访问权限以及它应该在哪里。 你无法使这个可配置,因为它成为一个鸡和蛋的问题。 可以应用各种特定于平台的猜测,但在存在SecurityManager时会中断。

(4)会起作用,但它正在飞行。 它要求运行JavaDB服务并强制用户确保正确配置应用服务器中的JDBC和池资源。 对于一项简单的工作而言,这是一项庞大而复杂的工作,实体建模无论如何都不适合偏好存储,因为它主要是关键/价值结构。

(5)可以工作,但要求用户知道将配置文件放在哪里可以在各种不同的应用服务器下找到它。 它还使应用程序很难提供任何类型的配置UI,因为它无法找到配置文件的本地路径或打开它进行写入,尤其是在存在SecurityManager的情况下。

(6)也可以工作,但强制用户在配置应用程序之前配置配置系统。 毋庸置疑,考虑到部署应用程序和创建资源的相对复杂性,对于那些还不了解Glassfish / EE的用户来说,这并不会让我感到兴奋。

那么……你如何处理选项的配置和存储? 您是否找到了一种方法,让您“只需要”,而无需用户配置任何内容以允许您的应用程序存储其配置?

偏好API的问题是由应用程序的战争中包含jaxb和stax实现jar引起的,由jersey-json引入。 这些被排除(因为它们是由应用程序服务器提供的),首选项API恢复正常运行。

看起来像用于设置的自定义UI的prefs API似乎是最好的方法。

虽然不是你谈到的环境: http : //www.osgi.org/javadoc/r4v42/org/osgi/service/cm/ConfigurationAdmin.html