如何在WebSphere中读取外部属性文件?

时间:2013-03-30 07:27:58

标签: java websphere

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

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

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

3 个答案:

答案 0 :(得分:7)

我认为最通用的方法是定义一个简单的环境条目,如 Java™平台企业版(Java EE)规范的 EE.5.4简单环境条目部分所述, V5

从部分(第68页):

  

简单的环境条目是用于的配置参数   自定义应用程序组件的业务逻辑。环境   条目值可以是以下Java类型之一:String,   字符,字节,短整数,长整数,布尔值,双精度和浮点数。

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

  

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

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

好处是您可以更改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中,您使用具有以下配置的WebSphere Binding描述符WEB-INF/ibm-web-bnd.xml

<?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提供的机制。

答案 1 :(得分:1)

您有三种选择:

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

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

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

答案 2 :(得分:0)

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

企业应用程序&gt; myear&gt;管理模块&gt; myjar.jar&gt;类加载器查看器 4 - 扩展 - com.ibm.ws.bootstrap.ExtClassLoader

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

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