【发布时间】:2014-01-03 17:34:40
【问题描述】:
我遇到了一个有趣的问题,即在运行时找不到 org.apache.log4j.Logger 类。我正在尝试获得授权,但这就是失败的地方:
OAuthAuthorizer oauthAuthorizer = new OAuthAuthorizer(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, SAML_PROVIDER_ID, userId);
我使用的是 JDeveloper 11.1.1.6。以下是我所知道的:
我查看了我的 UI.war/WEB-INF/lib 目录,并在其中看到了 log4j-1.2.17.jar。
-
抱怨它的类是 org.opensaml.xml.XMLConfigurator
Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Logger at org.opensaml.xml.XMLConfigurator.<clinit>(XMLConfigurator.java:60) at org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:195) at org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:91) at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.getSAMLBuilder(SAML2AssertionGenerator.java:156) at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.createSubject(SAML2AssertionGenerator.java:187) at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.buildAssertion(SAML2AssertionGenerator.java:114) at com.intuit.ipp.aggcat.util.SAML2AssertionGenerator.generateSignedAssertion(SAML2AssertionGenerator.java:83) at com.intuit.ipp.aggcat.util.SamlUtil.createSignedSAMLPayload(SamlUtil.java:156) at com.intuit.ipp.aggcat.util.OAuthUtil.getOAuthTokens(OAuthUtil.java:60) at com.intuit.ipp.aggcat.core.OAuthAuthorizer.<init>(OAuthAuthorizer.java:85) at com.incomemax.view.intuit.WebUtil.getAggCatService(WebUtil.java:91)Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:305) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:246) ... 64 more 我反编译了 XMLConfigurator,奇怪的是它没有导入 org.apache.log4j.Logger 它使用 org.slf4j.Logger,它也在我的 jars 目录 (slf4j-api-1.7.5.jar) 中。同样有趣的是,第 60 行(参见堆栈跟踪)在我的反编译中是一个空白行。
当然,如果我在设计时添加 Logger.xxxxx,它会觉得很好。
我直接使用示例 java 代码中的代码/jar,但导入到我现有的应用程序中。
我一直在网上搜索答案,我相信我已经检查了所有我能想到的领域。我还引用了这个非常好的页面:http://myarch.com/classnotfound/
鉴于授权是使用 Intuit Developer API 的第一步,我有点卡住了。
添加来自@jhadesdev 建议的输出:
log4j Logger的所有版本:
- zip:C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/ log4j-1.2.17.jar!/org/apache/log4j/Logger.class
从 OAuthAuthorizer 类的类加载器可见的所有 log4j 版本:
- zip:C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF/lib/ log4j-1.2.17.jar!/org/apache/log4j/Logger.class
所有版本的 XMLConfigurator:
jar:file:/C:/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator .class
zip:C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF /lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
zip:C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF /lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class
从 OAuthAuthorizer 类的类加载器可见的所有 XMLConfigurator 版本:
jar:file:/C:/Oracle/Middleware11116/modules/com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator .class
zip:C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF /lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
zip:C:/Users/Chris/AppData/Roaming/JDeveloper/system11.1.1.6.38.61.92/DefaultDomain/servers/DefaultServer/tmp/_WL_user/j2ee-app/lt5l71/war/WEB-INF /lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class
我仍在努力解释结果。
【问题讨论】:
-
如果您使用的是 Tomcat 8 并已符号链接您的 Web 应用程序中的任何文件夹,您需要有一个
allowLinking属性:<Context><Resources allowLinking="true"/>in$CATALINA_HOME/conf/context.xml
标签: java logging classpath classloader intuit-partner-platform