我想将Web项目的配置保存在Web项目之外的地方(ear / war文件)。应用程序不应知道它正在运行的容器(如WebSphere / JBoss等)。
处理这个问题的最佳方法是什么?
JNDI是否是一种清洁的方法?如果JNDI可以解决我的问题,那么我应该如何配置它?(自定义对象?)
在我的情况下,只有简单的键值对(String,String),用于SOAP / WS端点。
我想将Web项目的配置保存在Web项目之外的地方(ear / war文件)。应用程序不应知道它正在运行的容器(如WebSphere / JBoss等)。
处理这个问题的最佳方法是什么?
JNDI是否是一种清洁的方法?如果JNDI可以解决我的问题,那么我应该如何配置它?(自定义对象?)
在我的情况下,只有简单的键值对(String,String),用于SOAP / WS端点。
查看此问题,以读取WAR文件外的属性文件。
查看此问题,以从JNDI中读取变量值。我认为这是最佳解决方案。您可以使用以下代码读取字符串变量:
Context initialContext = new InitialContext();
String myvar = (String) initialContext.lookup("java:comp/env/myvar");
以上代码适用于所有容器。在Tomcat中,您需要在conf/server.xml文件中声明以下内容:
<GlobalNamingResources ...>
<Environment name="myvar" value="..."
type="java.lang.String" override="false"/>
</GlobalNamingResources>
以上内容将创建一个全局资源。也可以在应用程序的上下文中定义资源。在大多数容器中,JNDI资源可以通过MBeans管理控制台访问。其中一些提供了图形界面来编辑它们。当进行更改时,最多需要重新启动应用程序。
JNDI资源的定义和编辑是容器特定的。这是配置员/管理员应用适当设置的工作。
JNDI提供的好处包括:
System.getProperty("domain");
来加载适当的属性文件,我们能够满足要求。但是,系统属性并没有指向文件URL,相反,我们创建了一个称为“domain”的概念来指定要使用的配置。配置的位置始终为:$HOME/appName/config/$DOMAIN.properties
。-Ddomain=jason
/home/jason/appName/config/jason.properties
-Ddomain=ec2
,
这将加载:/home/jason/appName/config/ec2.properties
这种设置允许我们在每个环境中使用不同的配置,使用完全相同的编译二进制文件进行开发/ QA /发布周期。没有密码等信息捆绑在二进制文件中的风险,并且人们可以共享他们的配置以重新创建我们正在看到的问题。public void loadConfiguration() {
String configUrlStr = System.getenv("CONFIG_URL"); // You'd want to use a more
// Specific variable name.
if(configUrlStr == null || configUrlStr.equals("") {
// You would probably want better exception handling, too.
throw new RuntimeException("CONFIG_URL is not set in the environment.");
}
try {
URI uri = new URI(configUrlStr);
File configFile = new File(uri);
if(!configFile.exists()) {
throw new RuntimeException("CONFIG_URL points to non-existant file");
}
if(!configFile.canRead()) {
throw new RuntimeException("CONFIG_URL points to a file that cannot be read.");
}
this.readConfiguration(configFile);
} catch (URISyntaxException e) {
throw new RuntimeException("Malformed URL/URI in CONFIG_URL");
}
}