我们有一个Axis2应用程序,我们在websphere应用程序服务器中运行。该应用程序打包为WAR文件。我们需要在同一个websphere副本中运行同一个WAR的两个副本,并让应用程序的每个副本从文件系统加载不同的属性文件。我正在寻找可以在部署应用程序时从websphere管理控制台设置的内容,该内容对应用程序是可见的,可用于更改应用程序搜索其属性的方式。
现在属性文件存储在WAR中,因此我们为每个环境构建不同版本的WAR。相反,我们希望使用单个非环境特定的WAR文件,并在文件系统中存储外部属性文件。我们有这个工作。但是,我们在同一个websphere副本中托管了两个开发环境。因此,我们需要在同一个websphere服务器中部署同一个WAR的两个副本,并让每个实例加载不同的属性文件。
我们尝试的一件事是检查上下文根。当部署应用程序的两个副本时,它们每个都必须具有不同的上下文根(用于访问应用程序的URL的第一部分),并且Axis2 ConfigurationContext包括用于读取上下文根的功能。不幸的是,当应用程序在WAS中运行时,它获得了Axis2对上下文根的想法 - 它始终是“axis2” - 而不是WAS正在使用的真实上下文根。
编辑:为了澄清,我们希望在应用程序启动期间(在熟悉Axis2的人的ServiceLifecycle.startup()期间)加载属性文件。此时,没有要处理的实际Web服务请求,因此我们没有要检查的消息上下文。
答案 0 :(得分:0)
@kenster:使用websphere命名空间绑定。对于例如你可以使用name = context root of application和value = filesystem path创建命名空间绑定(在Environment下)然后你可以在应用程序中使用JNDI检索命名空间绑定,从value中指定的路径加载属性文件。
答案 1 :(得分:0)
我们发现了一个名为共享库的websphere功能,可以解决我们的问题。 websphere共享库实际上是一组条目 - 目录或jar文件 - 可以添加到单个应用程序的类路径中。我们为每个环境定义一个共享库 - 开发,测试等 - 并将每个环境的属性文件放在正确的目录中。
然后,在部署应该作为特定环境运行的WAR时 - 例如 - 我们 - 将dev共享库的引用添加到应用程序。为dev共享库定义的目录会自动添加到应用程序的类路径中。
我们正在研究的另一个更糟糕的解决方案是将文件添加到WAR的WEB-INF / classes目录中。此目录将自动添加到应用程序的类路径中。然后我们可以调用ClassLoader.getResource()来定位文件,并解析文件的路径名以获取应用程序的名称。通过为部署的应用程序的每个实例提供不同的名称,应用程序可以确定应该如何初始化自己。
答案 2 :(得分:0)
可以通过从java:comp / env命名空间查找来获取诸如URL资源之类的WebSphere资源引用,因此在部署时绑定。因此,您可以部署两次并绑定到不同的实例 - 您可能熟悉为JDBC资源执行此操作。
您可以使用各种有用的资源,例如文件URL。见The info centre