获取 EJB 中 WEB 模块的上下文根

Get context-root of WEB module in EJB

我有一个带有 WEB 模块和 EJB 模块的 EAR 项目。 这是来自 application.xml:

<module>
    <ejb>PersonEJB.jar</ejb>
</module>
<module>
    <web>
      <web-uri>PersonWeb.war</web-uri>
      <context-root>PersonWeb</context-root>
   </web>
</module>

我想从EJB写一个文件到WEB项目中,为此我需要找到WEB项目的路径。首先,我需要从 EJB 中的 application.xml 读取上下文根,但我不知道如何执行此操作。如果这不是我需要的解决方案,请告诉我另一个。

基本上,您希望有一种方法来指定 EJB 的路径,而无需以任何方式对它进行硬编码 - 毕竟,路径将根据应用程序的部署位置而改变。

这意味着使其可配置,并且有多种选择可以实现这一点。这里有一些。


使用数据库

如果您已经有一个数据库,您可以向其中添加一个 table,它包含一个简单的键值对,并以这种方式指定特定于服务器的配置数据。在您的应用程序中,您只需在应用程序启动时加载此数据一次,比如在 @Singleton EJB 中。

此方法有效,但在数据库中拥有配置数据有点难看,因为它是非常特定于应用程序的。数据库往往用于多个应用程序。我不推荐这条路,除非你已经有了这样的 table 开始。


使用属性文件

另一种方法是将其存储在属性文件中。大多数应用程序服务器都有一个特定的位置,您可以在其中放置特定于实例的配置文件并能够将它们加载到您的应用程序中。由于这是在 JBoss 环境中,您可以将文件放在服务器实例的 conf 目录中。您可以像这样以编程方式获取 conf 目录的路径:

String pathToConf = System.getProperty("jboss.server.config.dir");

这使您能够将配置文件放在那里并在您的应用程序中读回它们,例如在 @Singleton EJB 中。

你会在这里找到更详细的答案,非常抄袭table:

我非常喜欢这个选项。在文件系统上保护文件也是零努力,操作系统会为您完成工作。


使用 Java 属性

如果只是一个配置属性,你可以将它作为命令行传递给服务器实例属性如果你知道要修改哪个文件或设置哪个环境变量能够做到这一点(如果没有,它将被记录下来)。您可以添加一个参数

-Dmyapp.upload.dir=/path/to/dir

然后在您的代码中使用与上面相同的代码行返回此 属性。

    String pathToConf = System.getProperty("myapp.upload.dir");

这是开发方面最少的工作量。我自己不是很喜欢这个选项,因为它涉及到更改服务器配置,这可能会在你的控制之外丢失,比如在修补回合中。