【发布时间】:2011-07-12 12:17:10
【问题描述】:
我正在寻找将外部属性文件与将部署在 Weblogic 10.3 服务器上的应用程序一起使用的最佳方式。我阅读了该站点上的许多文章,但我不想硬编码属性文件的路径或将文件放在 domain/mydomain 文件夹中。
是否有一种动态的方式来执行此操作,以便在部署应用程序时还会将属性文件安装在例如部署文件夹下并从那里读取?
非常感谢
【问题讨论】:
标签: properties weblogic weblogic-10.x
我正在寻找将外部属性文件与将部署在 Weblogic 10.3 服务器上的应用程序一起使用的最佳方式。我阅读了该站点上的许多文章,但我不想硬编码属性文件的路径或将文件放在 domain/mydomain 文件夹中。
是否有一种动态的方式来执行此操作,以便在部署应用程序时还会将属性文件安装在例如部署文件夹下并从那里读取?
非常感谢
【问题讨论】:
标签: properties weblogic weblogic-10.x
另一个不需要将文件放在其他应用程序将读取它的位置的替代方法是使用通用文件加载覆盖: http://download.oracle.com/docs/cd/E21764_01/web.1111/e13702/config.htm#i1066493
这涉及到创建一个目录作为部署的根目录,我们称它为 FooApplication,它包含 FooApplication.ear 和 FooWeb.war。这称为应用程序安装目录。您的应用程序位于 FooApplication/app 子目录中,无论它是档案(如 .ear、.war、jar)还是其中一个档案的分解版本。您的可选部署计划(您必须有一个才能使用此功能,它可能是一个除了指定文档中描述的 config-root 元素和值之外没有太多作用的计划)在 FooApplication/plan 中。您可以将要覆盖的属性放在 FooApplication/plan/AppFileOverrides 目录结构中的应用程序中。 http://download.oracle.com/docs/cd/E21764_01/web.1111/e13702/deployunits.htm#sthref9
完成这种部署方式后,您可以从应用程序中编写这样的代码,并且从 FooApplication/plan/AppFileOverrides/FooWeb.war/myApp.properties 读取的 myApp.properties 的内容将是实际的文件阅读。
Properties myAppProps = new Properties();
InputStream iostream =
Thread.currentThread().getContextClassLoader().getResourceAsStream("myCfg/myApp.properties");
myAppProps.load(iostream);
这是通过向您的应用程序添加类加载器来完成的,如文档中所述。最初配置可能看起来很乏味,但它是一项直接满足原始问题且仅适用于特定应用程序的功能。
【讨论】:
您可以在类路径上设置一个目录,并将您的自定义属性文件放在该文件夹/目录中。这样,整个目录以及属性文件都将位于类路径中。 在 weblogic 10.3.x 中设置类路径上的目录
%DOMAIN_HOME%\config\ 文件夹中创建一个文件夹。例如appConfig。config.properties)放在appConfig 目录/文件夹中。修改setDomainEnv.cmd (Windows) 以将appConfig 包含在类路径中,方法是将%DOMAIN_HOME%\config\appConfig 设置为EXT_POST_CLASSPATH(此变量已在setDomainEnv.cmd 文件中定义)变量,如下所示:
set EXT_POST_CLASSPATH=%EXT_POST_CLASSPATH%;%DOMAIN_HOME%\config\appConfig
您可以在 java 代码中访问该文件,如下所示:
InputStream inputStream = Thread.currentThread ().getContextClassLoader().getResourceAsStream ("config.properties");
Properties prop = new Properties();
prop.load(inputStream);
String value = prop.getProperty("key");
希望这会有所帮助。
【讨论】:
方法 #2
使用 Weblogic 共享库
http://download.oracle.com/docs/cd/E12840_01/wls/docs103/programming/libraries.html
按照以下步骤进行
【讨论】:
当您说“我阅读了网站上的许多文章,但我不想硬编码属性文件的路径”时,我假设您是说您不想在 Java 中硬编码它代码。如果是这样,那么请看下面
在这里回答:
有一些方法可以从 weblogic 类路径中读取 Java 中的属性文件
一个(位于 weblogic 域中的属性文件):将属性文件拖放到域目录中。这样属性文件会自动添加到 weblogic 类路径中,我们可以使用 resourceAsStream 从 Java 中读取。
两个(来自用户定义位置的属性文件):这种方法的优点是属性文件可以驻留在 JAR 或 EAR 文件之外并且可以方便地修改。
package com.test;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class PropertyFileExample {
private static Properties prop;
public static void myMethod() {
InputStream is = null;
try {
prop = new Properties();
String propFilePath = System.getProperty(“propFileLocation“);
InputStream iStream = PropertyFileExample.class.getClassLoader().getResourceAsStream(propFilePath);
prop.load(iStream);
prop.getProperty(“dbuser”);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在 weblogic setDomainEnv(under bin) 中,我们需要将属性文件的位置作为 -D 参数传递给 JAVA_OPTIONS
设置 JAVA_OPTIONS=%JAVA_OPTIONS% -DpropFileLocation =/dev/file/properties/some.properties
希望对你有帮助!
【讨论】:
方法#1
更新您的服务器启动脚本以将以下系统变量传递给 JVM(以下是 Windows 操作系统上的示例)
call "%DOMAIN_HOME%\bin\startWebLogic.cmd" "-Dcom.mycompany.myapp.EXTERNAL_CONFIG_PATH=/mycompany/myapp/config" %*
使用这个指向您的配置目录的变量,从那里读取配置。您需要在要部署应用程序的每台服务器上进行此设置。
【讨论】: