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



我有一个带有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的路径,而无需以任何方式对其进行硬编码-路径将根据应用程序的部署位置而变化。

这意味着它是可配置的,有几个选项可以实现这一点。这里有一些。


使用数据库

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

这种方法是可行的,但是在数据库中有配置数据是一种有点难看的负担,因为它非常特定于应用程序。数据库往往只用于一个以上的应用程序。我不建议使用这种路径,除非您已经有了这样一个表。


使用属性文件

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

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

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

你会在这里找到一个更详细的答案,这是非常可复制的:

wildfly:从配置目录读取属性

我非常喜欢这个选项。文件在文件系统上的安全性也是零努力的,操作系统为您做这项工作。


使用Java属性

如果它只是一个配置属性,那么如果您知道要修改哪个文件或要设置哪个环境变量以便能够执行此操作,则可以将它作为命令行属性传递给服务器实例(如果不知道,则会对其进行记录)。您可以添加一个参数

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

然后在代码中使用与上面相同的代码行获取此属性。

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

在开发方面,这是最少的努力。我自己也不太喜欢这个选项,因为它涉及到更改服务器配置,可能会在你无法控制的情况下丢失,比如在打补丁时。