【问题标题】:Websphere Application Level Environment VariablesWebsphere 应用程序级环境变量
【发布时间】:2013-04-17 08:47:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java jakarta-ee websphere


    【解决方案1】:

    问题 1

    是否可以为两者设置不同的 DocStorageLocation 应用?

    我认为这是不可能的。 Websphere 的环境变量旨在供服务器本身使用。一个变量只有三种可能的作用域,分别是 Server、Cluster 和 Node。

    例如,server1, node1 范围内的 ORACLE_JDBC_DRIVER_PATH 环境变量可用于 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>
    

    然后测试,在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();
    }
    

    .properties 文件的 URL 资源

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

    例如,JNDI 名称 url/environmentJndiName 与 server1 上的值 file:///server1/environment.properties 和 file:///server2/environment。 server2 上的属性。

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

    在您的部署描述符 web.xml 中,资源的引用将是相同的。您不必在 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>
    

    然后使用此资源读取属性。

    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();
    }
    

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

    谢谢

    如果有更好的解决方案,或者没有回答问题,请告诉我。我仍在学习,但我使用 websphere 已经有一段时间了——即使我更喜欢其他解决方案。谢谢,@+。

    【讨论】:

    • 感谢 Magleff。我希望有某种方法可以将此配置保留在 EAR/WAR 之外。我们有许多不同的测试环境,我希望我们可以为所有这些环境部署一个相同的 EAR,将“应用程序代码”与“环境配置”完全分开。您是否认为有一种方法可以将属性文件放在“应用程序类路径”上而不是 EAR 的一部分?
    • @KevSheedy 我认为您可以使用 URL 资源。我编辑了我的答案。
    猜你喜欢
    • 2014-01-15
    • 2021-10-11
    • 2016-03-09
    • 2012-06-08
    • 2017-11-14
    • 2016-03-13
    • 2015-01-08
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多