【问题标题】:Deploying a WAR multiple times in Websphere with different properties?在 Websphere 中多次部署具有不同属性的 WAR?
【发布时间】:2011-10-03 21:56:10
【问题描述】:

我们有一个在 websphere 应用服务器中运行的 Axis2 应用程序。该应用程序被打包为 WAR 文件。我们需要在同一个 websphere 副本中运行同一个 WAR 的两个副本,并让应用程序的每个副本从文件系统加载不同的属性文件。我正在寻找可以在部署应用程序时从 websphere 管理控制台设置的内容,这些内容对应用程序可见,并可用于更改应用程序搜索其属性的方式。

现在属性文件存储在 WAR 中,因此我们为每个环境构建不同版本的 WAR。相反,我们希望使用一个单一的、非特定于环境的 WAR 文件和一个存储在文件系统中的外部属性文件。我们有这个工作。但是,我们在同一个 websphere 副本中托管了两个开发环境。所以我们需要在同一个 websphere 服务器中部署同一个 WAR 的两个副本,并让每个实例加载一个不同的属性文件。

我们尝试的一件事是检查上下文根。当部署应用程序的两个副本时,它们每个都必须具有不同的上下文根(用于访问应用程序的 URL 的第一部分),并且 Axis2 ConfigurationContext 包含一个用于读取上下文根的函数。不幸的是,当应用程序在 WAS 中运行时,它获得了 Axis2 的上下文根概念——它始终是“axis2”——而不是 WAS 使用的真正的上下文根。

编辑:为了澄清,我们希望在应用程序启动期间加载属性文件(对于那些熟悉 Axis2 的人来说,在 ServiceLifecycle.startup() 期间)。此时没有要处理的实际 Web 服务请求,因此我们没有要检查的消息上下文。

【问题讨论】:

    标签: web-services websphere axis2


    【解决方案1】:

    @kenster:使用 websphere 命名空间绑定。例如您可以使用 name=context 应用程序的根名称和 value= 文件系统路径创建名称空间绑定(在 Environment 下)...然后您可以在应用程序中使用 JNDI 检索名称空间绑定,以从 value 中指定的路径加载属性文件。

    【讨论】:

    • 感谢您的建议。但是,我不确定这将如何工作。命名空间绑定的可能范围不包括单个部署的应用程序。您建议绑定名称应该是上下文根。但据我所知,实际的 websphere 上下文根对我们的应用程序在其 Axis2 茧中是不可见的。因此,如果我们部署两个仅在 websphere 上下文根不同的 WAR 副本,它们将无法判断要读取哪个绑定。
    • @kenster:虽然我没有研究过axis2 cocoon,但我的想法是:你有通过HTTP URI 公开的Axis2 Web 服务。正确的?您的应用程序上下文根应存在于 HTTP URI:servername:port/CONTEXT/service-path。并且基于上下文根,您可以检索命名空间绑定。
    • 我添加了一个说明,即我们在应用程序部署期间尝试读取属性文件,在收到任何实际 Web 服务请求之前,因此无法检查请求使用的实际 URL。用于获取上下文根的 Axis2 函数未返回 WAS 配置使用的值。可能有一个用于获取上下文根的 websphere 函数,但我对 websphere API 没有任何了解。
    【解决方案2】:

    我们发现了一个名为共享库的 websphere 功能,可以解决我们的问题。 Websphere 共享库实际上是一组条目——目录或 jar 文件——可以添加到单个应用程序的类路径中。我们为每个环境(开发、测试等)定义一个共享库,并将每个环境的属性文件放在正确的目录中。

    然后,在部署应该作为特定环境(例如 dev)运行的 WAR 时,我们向应用程序添加对 dev 共享库的引用。为 dev 共享库定义的目录会自动添加到应用程序的类路径中。

    我们正在研究的另一个更骇人听闻的解决方案是将文件添加到 WAR 的 WEB-INF/classes 目录。该目录会自动添加到应用程序的类路径中。然后我们可以调用 ClassLoader.getResource() 来定位文件,并解析文件的路径名以获取应用程序的名称。通过为部署的应用程序的每个实例指定不同的名称,应用程序可以弄清楚它应该如何初始化自己。

    【讨论】:

    • 是的,共享库可以工作,我使用过这种技术,但我更喜欢资源引用。
    【解决方案3】:

    WebSphere 资源引用(例如 URL 资源)可以通过从 java:comp/env 命名空间中查找来获得,因此在部署时被绑定。因此,您可以部署两次并绑定到不同的实例 - 您可能熟悉为 JDBC 资源执行此操作。

    您可以使用多种有用的资源,例如 FILE URL。见The info centre

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2015-07-16
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多