jBOSS + ESAPI java.lang.ClassCastException:org.jboss.logmanager.log4j.BridgeLogger无法强制转换为org.owasp.esapi.Logger

时间:2013-09-06 11:08:52

标签: java maven logging jboss log4j

我是新手Java开发人员,在尝试使用JBOSS和ESAPI开发一些网站以确保安全性时我遇到异常

java.lang.ClassCastException: org.jboss.logmanager.log4j.BridgeLogger cannot be cast to org.owasp.esapi.Logger

当我尝试使用OWASP的ESAPI包时。

My Maven项目包括两个模块:oak-parent和oak-web。

Maven依赖树如下:

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ oak-web ---
[INFO] org.me.oak:oak-web:war:0.0.1-SNAPSHOT
[INFO] +- javax:javaee-api:jar:6.0:provided
[INFO] +- javax.servlet:javax.servlet-api:jar:3.0.1:provided
[INFO] +- log4j:log4j:jar:1.2.16:provided
[INFO] +- org.reflections:reflections:jar:0.9.8:compile
[INFO] |  +- javassist:javassist:jar:3.12.1.GA:compile
[INFO] |  \- dom4j:dom4j:jar:1.6.1:compile
[INFO] +- org.jboss:jboss-vfs:jar:3.0.1.GA:provided
[INFO] |  \- org.jboss.logging:jboss-logging:jar:3.0.0.CR1:provided
[INFO] +- org.owasp.esapi:esapi:jar:2.0.1:compile
[INFO] |  +- commons-configuration:commons-configuration:jar:1.5:compile
[INFO] |  |  +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  |  |  +- logkit:logkit:jar:1.0.1:compile
[INFO] |  |  |  +- avalon-framework:avalon-framework:jar:4.1.3:compile
[INFO] |  |  |  \- javax.servlet:servlet-api:jar:2.3:compile
[INFO] |  |  \- commons-digester:commons-digester:jar:1.8:compile
[INFO] |  |     \- commons-beanutils:commons-beanutils:jar:1.8.3:compile
[INFO] |  +- commons-beanutils:commons-beanutils-core:jar:1.7.0:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.2:compile
[INFO] |  +- xom:xom:jar:1.1:compile
[INFO] |  |  +- xerces:xmlParserAPIs:jar:2.6.2:compile
[INFO] |  |  +- xalan:xalan:jar:2.7.0:compile
[INFO] |  |  \- jaxen:jaxen:jar:1.1-beta-8:compile
[INFO] |  |     \- jdom:jdom:jar:1.0:compile
[INFO] |  +- org.beanshell:bsh-core:jar:2.0b4:compile
[INFO] |  \- org.owasp.antisamy:antisamy:jar:1.4.3:compile
[INFO] |     +- org.apache.xmlgraphics:batik-css:jar:1.7:compile
[INFO] |     +- net.sourceforge.nekohtml:nekohtml:jar:1.9.12:compile
[INFO] |     \- commons-httpclient:commons-httpclient:jar:3.1:compile
[INFO] |        \- commons-codec:commons-codec:jar:1.7:compile
[INFO] +- org.jsoup:jsoup:jar:0.2.2:compile
[INFO] |  \- commons-lang:commons-lang:jar:2.4:compile
[INFO] +- xerces:xercesImpl:jar:2.11.0:compile
[INFO] |  \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] +- org.apache.xmlgraphics:batik-codec:jar:1.7:compile
[INFO] |  +- org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile
[INFO] |  +- org.apache.xmlgraphics:batik-bridge:jar:1.7:compile
[INFO] |  |  +- org.apache.xmlgraphics:batik-anim:jar:1.7:compile
[INFO] |  |  +- org.apache.xmlgraphics:batik-ext:jar:1.7:compile
[INFO] |  |  +- org.apache.xmlgraphics:batik-parser:jar:1.7:compile
[INFO] |  |  \- org.apache.xmlgraphics:batik-script:jar:1.7:compile
[INFO] |  \- org.apache.xmlgraphics:batik-util:jar:1.7:compile
[INFO] \- org.apache.xmlgraphics:batik-transcoder:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:fop:jar:0.94:compile
[INFO]    |  +- org.apache.xmlgraphics:xmlgraphics-commons:jar:1.2:compile
[INFO]    |  +- commons-io:commons-io:jar:2.4:compile
[INFO]    |  +- org.apache.avalon.framework:avalon-framework-api:jar:4.3.1:compile
[INFO]    |  \- org.apache.avalon.framework:avalon-framework-impl:jar:4.3.1:compile
[INFO]    +- org.apache.xmlgraphics:batik-dom:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-gvt:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-svggen:jar:1.7:compile
[INFO]    +- org.apache.xmlgraphics:batik-xml:jar:1.7:compile
[INFO]    \- xml-apis:xml-apis-ext:jar:1.3.04:compile

我已经创建了jboss-deployment-structure.xml来尝试排除log4j(文件是在oak-parent / META-INF中创建的:

<jboss-deployment-structure>
 <ear-subdeployments-isolated>true</ear-subdeployments-isolated>
  <deployment>
    <exclusions>
      <module name="org.apache.log4j" />
      <module name="org.jboss.logging" />
      <module name="org.jboss.logmanager" />
      <module name="org.jboss.log4j.logmanager" />
      <module name="org.jboss.logmanager.log4j" />
    </exclusions>
  </deployment>
  <sub-deployment name="oak-web.war">
   <exclusions>
      <module name="org.apache.log4j" />
      <module name="org.jboss.logging" />
      <module name="org.jboss.logmanager" />
      <module name="org.jboss.log4j.logmanager" />
      <module name="org.jboss.logmanager.log4j" />
    </exclusions>
  </sub-deployment>
</jboss-deployment-structure>

但它仍然没有任何帮助。

你们中有谁知道这个问题的解决方案吗?与jboss 5相比,JBoss类加载器有点改变。

4 个答案:

答案 0 :(得分:2)

将log4j.properties文件放在resources文件夹下的行:

log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory

答案 1 :(得分:2)

EDIT(13.10.2014): 我建议使用版本2.1.0,它使用log4j classloader解决了这个问题。


最后我设法解决了这个问题。结合互联网上的几种方法。

  1. 我创建了oak-ear package
  2. 在橡树耳中,我添加了src/main/application/META-INF/jboss-deployment-structure.xml

    <?xml version='1.0' encoding='UTF-8'?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
        <deployment>
            <dependencies>
                <module name="org.mickula.mylog" />
            </dependencies>
            <exclusions>
                <module name="org.apache.log4j" />
            </exclusions>
        </deployment>
        <sub-deployment name="oak-web.war">
            <dependencies>
                <module name="org.mickula.mylog" />
            </dependencies>
            <exclusions>
                <module name="org.apache.log4j" />
            </exclusions>
        </sub-deployment>
    </jboss-deployment-structure>
    
  3. 我在jboss目录中的下一步已将org/apache/log4j/main/log4j.jar复制到org/mickula/mylog/main/并在那里创建了module.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <module xmlns="urn:jboss:module:1.0" name="org.mickula.mylog">
        <resources>
            <resource-root path="log4j-1.2.16.jar"/>
        </resources>
        <dependencies>
            <module name="javax.api"/>
        </dependencies>
    </module>
    

    此更改允许我创建自己的log4j.properties文件。 我也是jboss/standalone/configuration/

  4. 最后,我通过起始脚本将JBoss指向新的log4j.properties文件: 在我添加的文件末尾的jboss/bin/standalone.conf中:

    JAVA_OPTS="$JAVA_OPTS -Dlog4j.configuration=file://URL_TO_THE_JBOSS/jboss711/standalone/configuration/log4j.properties"

  5. 现在用ESAPI运行JBoss成功了。谢谢你的帮助。

答案 2 :(得分:0)

您是否尝试过此排除:

<jboss-deployment-structure>
    <deployment>
        <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
        <exclusions>
            <module name="org.apache.log4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

我刚刚在this site找到了。该建议未经验证是否有效,但您可以尝试一下。

修改

排除log4j的另一种方法是在maven中使用:

<exclusion>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
</exclusion>

表示esapi的maven依赖关系。这会产生预期的效果吗? (我看到你在依赖树上有它,我找了它,因为我读了this link)。

答案 3 :(得分:0)

您没有提到JBoss应用服务器的版本,但我猜它的7.X
两个接口都是org.owasp.esapi.reference.Log4JLogger和org.jboss.logmanager.log4j。 BridgeLogger扩展了org.apache.log4j.Logger。

这实际上是log4j的jboss问题的一个变种,常见的解决方案是将mic4建议的log4j排除在外。

从依赖树我可以看到你没有从依赖于log4j的esapi 2.0.1依赖中获取log4j(添加你的pom会很有用)。所以看起来你的pom很好。

我猜你还是从类路径的某个地方得到了log4j 尝试使用以下变体(在每个级别上排除)。

<jboss-deployment-structure>
              <deployment>
                  <exclusions>
                  <module name="org.apache.log4j" />
                  </exclusions>
              </deployment>
              <sub-deployment name="MyWeb.war">
                    <exclusions>
                    <module name="org.apache.log4j" />
                    </exclusions>
              </sub-deployment>
              <sub-deployment name="MyBeans.jar">
                <exclusions>
                  <module name="org.apache.log4j" />
                </exclusions>
              </sub-deployment>
</jboss-deployment-structure> 

另见以下答案 Using application's Log4J configuration under JBoss 7.1.1