3

我开发了一个示例 Web 应用程序,它将从外部属性文件中读取数据。属性文件位于我系统的源文件夹中,不包含在 WAR 文件中。

属性文件的访问方式如下:

Properties prop = new Properties();
//File f1 = new File("Property.properties");
prop.load(getClass().getClassLoader().getResourceAsStream("Property.properties"));
  1. 如何在 WAR 文件中从外部访问此属性文件?
  2. 必须对代码进行哪些更改才能在 WAR 文件中读取它?
4

3 回答 3

8

我认为最通用的方法是定义一个简单的环境条目,如EE.5.4 Java™ Platform, Enterprise Edition (Java EE) Specification, v5的简单环境条目部分所述。

从部分(第 68 页):

简单的环境条目是用于自定义应用程序组件的业务逻辑的配置参数。环境条目值可以是以下 Java 类型之一:String、Character、Byte、Short、Integer、Long、Boolean、Double 和 Float。

您还可以使用规范的EE.5.6.1.4 标准资源管理器连接工厂类型部分中描述的 URL 连接工厂。

Application Component Provider 必须使用 java.net.URL 资源管理器连接工厂类型来获取 URL 连接。

两者都需要在WEB-INF/web.xmlWeb 应用程序的部署描述符中定义资源引用,以便您可以使用@Resource或使用 JNDI APIjava:comp/env作为入口点来注入值。

好处是您可以更改 Web 应用程序的配置,而无需重新编译代码,还可以使用管理员习惯使用的应用程序服务器的管理工具来更改它。

web.xml您定义资源引用。

<resource-ref>
  <res-ref-name>propertiesURL</res-ref-name>
  <res-type>java.net.URL</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<resource-ref>
  <res-ref-name>propertiesPath</res-ref-name>
  <res-type>java.lang.String</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

然后在您的代码中,您使用以下内容来访问这些值:

@Resource
String propertiesPath;

@Resource
URL propertiesURL;

这样,您就满足了 Java EE 的要求,您可以使用propertiesPathpropertiesURL将它们作为输入参数传递给您的方法。

现在,是时候满足 WebSphere Application Server 的期望了。

您定义的是需要映射到其管理名称的逻辑名称(应用程序服务器知道并可以提供给应用程序)。

在 WebSphere Application Server 中,您使用WEB-INF/ibm-web-bnd.xml具有以下配置的 WebSphere Binding 描述符:

<?xml version="1.0" encoding="UTF-8"?>
<web-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_1.xsd"
  version="1.1">

  <virtual-host name="default_host" />

  <resource-ref name="propertyURL" binding-name="propertyURL" />
  <resource-ref name="propertyURL" binding-name="propertyURL" />
</web-bnd>

当应用程序被部署时,WAS 允许您将这些映射映射到其管理的资源。使用 ISC 控制台定义环境条目的值并将它们映射到应用程序。

使用 WebSphere Liberty Profile 变得更加容易。我在文章Using @Resource to access JNDI in WebSphere AS 8.5 Liberty Profile 中描述了 WLP 提供的机制。

于 2013-03-31T08:31:16.277 回答
1

你有三个选择:

  1. 配置 Websphere 以在类路径中包含包含属性文件的目录。不知道该怎么做,但我相信这是可能的,因为我们的应用程序做同样的事情

  2. 在战争档案中包含属性文件。你可能不想这样做。

  3. 而是使用类加载器加载属性文件,使用带有绝对路径的文件 api。我不完全确定 WAS 是否允许这样做,但无论如何这都是一个坏主意,因为它使您的应用程序非常依赖于它真正不应该关心的事情,例如应用程序的安装路径。

于 2013-03-30T07:33:46.000 回答
0

WebSphere 在类路径上有两个文件夹,可以从那里加载属性:

Enterprise Applications > myear > Manage Modules > myjar.jar > Class loader viewer 4 - Extension - com.ibm.ws.bootstrap.ExtClassLoader

文件:/projekte/IBM/WebSphere/AppServer-8.5/classes/

文件:/projekte/IBM/WebSphere/AppServer-8.5/lib/

于 2014-05-16T15:03:26.783 回答