在jboss-web.xml中使用属性/变量

时间:2011-02-24 17:35:25

标签: java jboss

我有一个配置为在JBoss下使用作用域类加载器的WAR。这一切都很好,花花公子。 jboss-web.xml中的配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
  "-//JBoss//DTD Web Application 4.2//EN"
  "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">

<jboss-web>
    <class-loading>
        <loader-repository>
            com.mycompany:loader='com.mycompany.repository'
            <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
        </loader-repository>
    </class-loading>
</jboss-web>

现在,客户端希望在同一JBoss实例下部署两个WAR文件副本。它们被配置为使用相同的类加载器存储库,这会导致问题。

如果我手动更改WAR文件的一个副本中的jboss-web.xml以指定不同的存储库,例如通过将相关行更改为:

            com.mycompany:loader='com.mycompany.repository2'

...... WAR的两个副本都没有遇到麻烦。

但是,攻击WAR文件的内部对于客户来说并不是一个很棒的解决方案。

如果我可以将上下文根目录合并到存储库的名称(或两个部署之间保证不同的其他属性),则可以自动完成。

是否可以在jboss-web.xml中使用属性?让我做类似的事情:

            com.mycompany:loader='com.mycompany.repository-${jboss.context-root}'

(注意:我编写了该属性名称。)

稍微退一步,有没有更好的方法来完成我想要完成的任务?

2 个答案:

答案 0 :(得分:1)

实现所需内容的正常J2EE方法是将代码与部署分开。这意味着将jboss-web.xml置于WAR中是错误的。 应在部署期间使用此特定于部署的配置文件。我真的不知道jboss部署过程,但对于Oracle IAS,它是以下内容:

  • WAR / EAR仅包含特定于代码的设置和env条目的声明,已使用的数据源,安全角色等(在web.xml中),但不包含条目的值
  • 在部署时,包含角色,数据源,环境条目等的映射运行时值的供应商特定部署描述符(Oracle的orion-web.xml,jBoss的jboss-web.xml)将传递给容器(这是以特定于容器的方式完成的,Oracle采用通过cmdline arg或通过浏览器形式上传的部署计划文件,即您上载EAR和部署计划,部署计划包含所有特定于供应商的部署描述符)

JSR 88定义了部署计划概念,并定义了deployment plan facility。所以这应该是你寻找int jboss文档的起点。

如前所述,这是从代码WAR / EAR中分离部署时值映射的标准J2EE方法。 在您的特定情况下,您最终会得到一个EAR和两个不同的部署计划。

答案 1 :(得分:0)

您可以将war文件部署为展开的.WAR目录,而不是单个.WAR文件。这将允许您在每个实例中轻松编辑jboss-web.xml。 Web应用程序中引用的任何代码/资源都应编译到JARS中并添加到apps类路径中。这会减少你的WARS的大小并阻止他们被误编辑。