我是新手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类加载器有点改变。
答案 0 :(得分:2)
将log4j.properties文件放在resources文件夹下的行:
log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory
答案 1 :(得分:2)
EDIT(13.10.2014): 我建议使用版本2.1.0,它使用log4j classloader解决了这个问题。
最后我设法解决了这个问题。结合互联网上的几种方法。
oak-ear
package 在橡树耳中,我添加了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>
我在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/
。
最后,我通过起始脚本将JBoss指向新的log4j.properties
文件:
在我添加的文件末尾的jboss/bin/standalone.conf
中:
JAVA_OPTS="$JAVA_OPTS -Dlog4j.configuration=file://URL_TO_THE_JBOSS/jboss711/standalone/configuration/log4j.properties"
现在用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