我怎么可以存储Java EE构参数以外的一个耳朵还是战争?
-
12-09-2019 - |
题
我想储存配置的一个网络项目之外的网络项目(ear/战争文件)。应不应该知道的在其它容器的运行(WebSphere/Boss等)。
什么是最好的方式来处理这个吗?
是JNDI一个清洁的方式?如果JNDI可以解决我的问题,应如何配置?(定义的对象?)
在我的情况下,只有简单的Key=>值对(String,String)用肥皂/WS端点。
解决方案
看看这个 的问题 对于阅读的属性文件之外的战争的文件。
看看这个 的问题 对于阅读的变量值从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资源可以通过一个Mbean管理控制台。一些他们提供了一个图形界面来编辑。在大多数应用程序需要重新启动,当一个变化是制成。
如何JNDI资源的定义和编辑的容器的具体。这是工作的配置员/管理人员来应用适当的设置。
这些都是所提供的福利JNDI:
- 你可以定义的默认值的参数在战争/耳文件。
- 参数是很容易配置的容器。
- 你不需要重新启动容器在修改的价值的参数。
其他提示
我们部署了不同的开发web应用程序时,也有类似的配置要求,并在亚马逊的EC2:我们如何从二进制代码中分离出来的配置?根据我的经验,JNDI是太复杂了,变化太大之间使用的容器。此外,手工编辑XML是语法错误非常敏感,所以他的想法被抛出。我们解决了这个基于一些规则设计:
1)仅简单名称=应使用值项
2)新的配置应该是通过仅改变一个参数
可加载3)我们的WAR二进制必须是可重新配置的W / O型重新包装
4)敏感参数(密码)将永远不会在二进制包装
使用.properties文件的所有结构,并且使用System.getProperty("domain");
加载适当的属性文件,我们能够满足要求。但是,系统属性不指向文件的URL,而不是我们创造了我们称之为“域”指定要使用的配置的概念。配置的位置始终是:点击
$HOME/appName/config/$DOMAIN.properties
。
所以,如果我想用我自己的配置来运行我的应用程序,我通过设置域名到我的名字启动应用程序:点击
-Ddomain=jason
结果
在启动和应用程序加载文件:点击
/home/jason/appName/config/jason.properties
结果
这让开发者共享配置,所以我们可以重新创建应用程序的测试和部署的相同状态而无需重新编译或重新包装。然后,域值被用于从一个标准的位置加载的.properties,捆绑WAR之外。
我可以完全通过使用类似于生产配置重新我的工作站上的生产环境中:结果
-Ddomain=ec2
这将加载:点击
/home/jason/appName/config/ec2.properties
这个设置允许我们做有开发/ QA /释放循环与恰好 - 酮设定编译的二进制文件的,在每种环境中使用不同的配置。有没有有密码的/ etc中的二进制文件捆绑的风险,人们可以分享他们的配置来重新创建,我们所看到的问题。
我使用环境变量指向一个URL(这可能是一个文件:// URL),其具有在它我的配置。这是设置非常简单,不需要JNDI基础设施。
下面是一些示例代码(从存储器输入的 - 我还没有编译/测试此):
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");
}
}
可以只存储然后是一个正常的Java属性文件,该文件是类路径上,并且只是加载属性?
这很简单,很简单..除非我失去了一些东西。
我最喜欢的地方是:环境变量和性能的文件(作为建议通过Jared和kgiannakakis上。)
表数据库储存的环境性能
但是其他一个简单的解决方案是有表数据库储存的环境特性。
如果应用程序使用的数据库
- 这是相对容易安装
- 给真正简单的方法来控制/改变价值观
- 它可以综合的过程中以及通过使它部分数据库的脚本