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

存储和编辑JavaEE应用程序的配置,java,glassfish,java-ee-6,Java,Glassfish,Java Ee 6,更新:在写这篇文章大约一年后,请参阅我关于这个主题的博客文章: 。。。有关此主题的JavaEE7规划讨论的参考资料 我基本上已经完成了一个小型JavaEE6应用程序的编写,并且正在用一个合适的动态配置接口替换硬编码的首选项 我不确定如何——或者更具体地说,在哪里——存储设置。一定有一些明显的“标准”方法可以做到这一点,它们可以跨各种框架和容器“正常工作”,但就我而言,我找不到它 我想要的是一种加载和存储设置的简单方法,这种方法可以跨不同的应用服务器和操作系统工作,不需要用户进行任何配置,而且实

更新:在写这篇文章大约一年后,请参阅我关于这个主题的博客文章:

。。。有关此主题的JavaEE7规划讨论的参考资料


我基本上已经完成了一个小型JavaEE6应用程序的编写,并且正在用一个合适的动态配置接口替换硬编码的首选项

我不确定如何——或者更具体地说,在哪里——存储设置。一定有一些明显的“标准”方法可以做到这一点,它们可以跨各种框架和容器“正常工作”,但就我而言,我找不到它

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

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

  • 使用容器环境中的上下文参数
  • 使用Java首选项API存储它们
  • 正在读取/写入属性文件。。。某处
  • 使用JPA将它们存储在容器提供的JavaDB中
  • 将其放入从类路径加载的属性文件中
  • 使用系统属性设置配置选项或.properties文件的路径
  • 这似乎是一个基本要求,在容器应该为您提供您可能需要的所有核心服务的环境中,这一要求会得到很好的满足,但所有这些方法都有问题

    A表示(1)不可行,而且在任何情况下Glassfish web admin用户界面都无法配置上下文参数,因此您必须使用“asadmin”和一些不太可爱的命令行语法来实现。上下文参数只能通过ServletContext进行访问,而ServletContext在JSF2、JAX-RS和原始Servlet等框架之间无法以一致的方式进行访问,但至少SeamServlet可以处理这个问题

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

    (3) 可能有效-但无法知道您的应用程序在文件系统上的何处具有读/写访问权限以及应该在何处查找。您不能将其配置为可配置的,因为这将成为一个鸡和蛋的问题。可以应用各种特定于平台的猜测,但如果有SecurityManager在场,猜测就会中断

    (4) 会有用的,但这是用核弹炸苍蝇。它要求运行JavaDB服务,并强制用户确保正确配置了应用服务器中的JDBC和池资源。对于一项简单的工作来说,它既大又复杂,而且实体建模无论如何都不适合首选项存储,因为它大部分都是关键/价值结构的

    (5) 可以,但需要用户知道将配置文件放在哪里,在不同的应用程序服务器下可以找到配置文件。这也使得应用程序很难提供任何类型的配置UI,因为它不一定能找到配置文件的本地路径或打开它进行写入,尤其是在有SecurityManager的情况下

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


    所以。。。您如何处理选项的配置和存储?您是否找到了一种方法,可以让您“直接完成”而用户不必配置任何东西来允许您的应用程序存储其配置?

    尽管不是您所说的环境:

    首选项API的问题是由于在应用程序的war中包含jaxb和stax实现JAR而导致的,由泽西拉进来。排除这些选项后(因为它们是由应用服务器提供的),preferences API恢复正常运行


    看起来带自定义UI的prefs API似乎是最好的安装方式。

    现在继续使用glassfish 3.0.1。Thorbjørn:我运行3.1是因为3.0有太多的大错误,我无法使用。听到3.1“需要成熟”让我非常非常不高兴。为什么##$@Oracle会考虑JavaEE7,而EE6的内容是如此不成熟、有缺陷,而且不同API之间的内部不一致?如果我放弃Glassfish,转而使用Tomcat或JBoss AS 6,我能期待更好的结果吗?我发现3.0.1对我们来说非常好(但3.0是有缺陷的)。我还没有仔细看过3.1A,我看到一个bug报告影响了我们的使用。Thorbjørn:我想这取决于你使用什么。3.0.1破坏了对无接口局部视图的处理,这意味着它们不适用于继承自超类()的方法,由于各种错误与Seam Wedder不兼容,不适用于Jersey 1.5等。我在3.1中更幸运。这就是说,现在我无法重现以前破坏prefs的问题(wtf?!),因此可能有希望使用Preferences API。很抱歉听到这些问题。从控制台完全更新3.0.1时,它们是否仍然存在?当您知道它是否仍然存在或者您遇到的bug已经修复时,请进行跟进。谢谢。这里有一条2001年的讨论线索,同样的问题。哇,JavaEE移动得太快了。。。。在Windows上,首选项API尝试保存到注册表,但由于缺少对我的权限而失败。我听说你可以手动创建注册表项和/或以管理员身份更新权限设置,但这是一个关闭。