Websphere应用程序级环境变量

Kev*_*edy 4 java websphere java-ee

是否可以在websphere 中的应用程序级别设置环境变量?

Websphere服务器可以托管多个应用程序.在服务器级别应用的任何环境变量都适用于该服务器上的所有应用程序.是否可以创建仅适用于单个应用程序的变量?

例如:假设我们在同一台服务器上运行SpreadsheetApp和DocsApp.它们共享一些可以通过名为DocStorageLocation的环境变量配置的公共代码.是否可以为两个应用程序设置不同的DocStorageLocation?

或者,是否有另一种配置在同一服务器上运行的应用程序的方法?

小智 7

问题1

是否可以为两个应用程序设置不同的DocStorageLocation?

我不认为这是可能的.Websphere的环境变量意味着服务器本身使用.变量只有三个可能的范围,即服务器,集群和节点.

例如,server1上的ORACLE_JDBC_DRIVER_PATH环境变量,node1作用域可用于node1上的JDBC提供程序(classPath = $ {ORACLE_JDBC_DRIVER_PATH} /ojdbc14.jar).

问题是:"为什么我不能仅为我的应用程序设置不同的值"?但我的猜测是,只要启动服务器,集群和节点,为已部署的应用程序覆盖此值就没有意义.

虽然我认为这是不可能的,但我仍然尝试过.但我没有设法覆盖为websphere服务器设置的环境变量.

问题2

或者,是否有另一种配置在同一服务器上运行的应用程序的方法?

环境进入

您可以在web.xml部署描述符中添加一个环境条目,这是您可以查找的变量.

<env-entry>
    <env-entry-name>DocStorageLocation</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>C:/DocStorage</env-entry-value>
</env-entry>
Run Code Online (Sandbox Code Playgroud)

然后测试,在java类中查找这个变量:

//TEST
Object l_test = null;
try {
    Context l_ctx = new InitialContext();
    l_test = l_ctx.lookup("java:comp/env/DocStorageLocation");
} catch (NamingException e1) {
    // TODO
    e1.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

.properties文件的URL ressource

您可以创建URL资源.它将链接到本地​​主机或任​​何服务器上的.properties文件集,因此可以根据环境将每个属性设置为不同的值.

例如,JNDI名称url/environmentJndiName在server1上具有值file:///server1/environment.properties,在server2上具有file:///server2/environment.properties.

然后在服务器1上,您可以在environment.properties文件中设置docStorageLocation = value1,在server2上设置docStorageLocation = value2.

在部署描述符web.xml中,ressource的引用将是相同的.您不必在java源代码中更改此引用:

   <resource-ref>
         <res-ref-name>url/environment</res-ref-name>
         <res-type>java.net.URL</res-type>
         <res-auth>Application</res-auth>
         <res-sharing-scope>Shareable</res-sharing-scope>
   </resource-ref>
Run Code Online (Sandbox Code Playgroud)

然后使用此ressource来读取属性.

try {
    Context l_ctx = new InitialContext();
    URL l_url = (URL) l_ctx.lookup("java:comp/env/url/environment");
    // New properties
    Properties l_properties = new Properties();
    // Load properties
    this.loadProps(l_properties, l_url.getPath());

} catch (NamingException e1) {
    // TODO
    e1.printStackTrace();
} catch (IOException e) {
    // TODO Bloc catch auto-généré
    e.printStackTrace();
}

    ...

private void loadProps(final Properties p_properties, final String p_fileLocation)
    throws IOException
{
    // Open stream
    BufferedInputStream l_is = new BufferedInputStream(
            new FileInputStream(
                    new File(p_fileLocation)));

    p_properties.load(l_is);
    // Close stream
    l_is.close();
}
Run Code Online (Sandbox Code Playgroud)

您需要将web.xml 的ressource引用url/environment绑定到在websphere服务器上为此ressource设置的JNDI名称url/environmentJndiName.使用websphere修改ibm-web-bnd.xml文件,使用glassfish修改sun-web.xml文件等.

谢谢

如果有更好的解决方案,或者它没有回答问题,请告诉我.我还在学习,但我一直在使用websphere一段时间 - 即使我更喜欢其他解决方案.谢谢,@ +.