我有一个带有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读取context-root,但我不知道如何做到这一点。如果这不是我需要的解决方案,请告诉我另一个。
答案 0 :(得分:2)
基本上,您希望有一种方法来指定EJB的路径,而无需以任何方式对其进行硬编码 - 路径将根据应用程序的部署位置而发生变化。
这意味着要使其可配置,并且有几个选项可以实现。这里有一把。
使用数据库
如果您已有数据库,则可以向其添加一个表,该表包含一个简单的键值对,并指定特定于服务器的配置数据。在您的应用程序中,您只需在应用程序启动时加载此数据一次,例如在@Singleton
EJB中。
这种方法有效,但在数据库中使用配置数据有点丑陋,因为它非常特定于应用程序。数据库往往不仅仅用于一个应用程序。除非你已经开始使用这样的表,否则我不推荐这条路径。
使用属性文件
另一种方法是将其存储在属性文件中。大多数应用程序服务器都有一个特定位置,您可以在其中放置特定于实例的配置文件,并能够在应用程序中加载它们。因为在JBoss环境中,您可以将该文件放在服务器实例的conf目录中。您可以通过编程方式获取conf目录的路径:
String pathToConf = System.getProperty("jboss.server.config.dir");
这使您能够将配置文件放在那里并在应用程序中读取它们,例如在@Singleton
EJB中。
你会在这里找到一个更加详细的答案:
wildfly: reading properties from configuration directory
我非常喜欢这个选项。文件系统上的文件也是零安全保护,操作系统可以为您完成工作。
使用Java属性
如果它只是一个配置属性,您可以将它作为命令行属性传递给服务器实例,如果您知道要修改哪个文件或设置哪个环境变量才能执行此操作(如果不是,则将记录在案)。您可以添加参数
-Dmyapp.upload.dir=/path/to/dir
然后在您的代码中使用与上面相同的代码行返回此属性。
String pathToConf = System.getProperty("myapp.upload.dir");
这是开发方面最少的努力。我自己并不是很喜欢这个选项,因为它涉及更改服务器配置,这可能会在你的控制范围之外丢失,比如在修补过程中。