java - 原因:java.lang. NoClassDefFoundError: org/apache/log4j/Logger

  显示原文与译文双语对照的内容
0 0

我有个有趣的现象,在该组织.apache .log4j .Logger类在运行时找不到。 我只是在授权和那里很失败:

OAuthAuthorizer oauthAuthorizer = new OAuthAuthorizer(OAUTH_CONSUMER_KEY, OAUTH_CONSUMER_SECRET, SAML_PROVIDER_ID, userId);

我使用JDeveloper 11 .1 .1 .6 。 这就是我知道:

  1. 我看到了我的UI .war/WEB INF/lib目录我还看到了log4j 1 .2 .17 jar那里。

  2. 抱怨是org .XMLConfigurator .opensaml 。xml的类

    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
  3. 我decomplied XMLConfigurator奇怪的是它不会导入org .apache .log4j .Logger它使用org .slf4j .Logger它也是在我的jar目录( slf4j api 1 .7 .5 。jar ) 。 另外有趣的是,第60 ( 参见堆栈跟踪) 是一个空白行在我反编译。

  4. 当然,如果我添加Logger .xxxxx在设计过程中,它发现它很好。

  5. 我在用代码直接code/jars的示例java代码,但是导入到我现有的应用程序。

我在网上搜索的答案,我想我已经查了所有我能想到的各个方面。 我也参照此很好的页面: http://myarch .com/classnotfound/

在下面小节给定授权使用Intuit开发者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 /org/apache/log4j/Logger class jar !

所有版本的log4J可见的类的类加载器OAuthAuthorizer类:

  • 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 /org/apache/log4j/Logger class jar !

所有版本的XMLConfigurator :

  • jar:file:/C:/Oracle/Middleware11116/modules/com .bea .core .bea .opensaml2_1 .0 .0 .0_6 1 0 0 /org/opensaml/xml/XMLConfigurator class jar !

  • 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 /org/opensaml/xml/XMLConfigurator class jar !

  • 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 /org/opensaml/xml/XMLConfigurator class jar !

所有版本的XMLConfigurator可见的类的类加载器的OAuthAuthorizer类:

  • jar:file:/C:/Oracle/Middleware11116/modules/com .bea .core .bea .opensaml2_1 .0 .0 .0_6 1 0 0 /org/opensaml/xml/XMLConfigurator class jar !

  • 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 /org/opensaml/xml/XMLConfigurator class jar !

  • 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 /org/opensaml/xml/XMLConfigurator class jar !

我还在解释结果。

时间:原作者:7个回答

0 0

在运行时应用程序时提示找不到jar 。

那么请务必注意两个或三个不同的异常我们想象两岸在本例中:

  1. java lang .ClassNotFoundException 此异常指示该类在classpath上找不到。 这表明我们在试图装入类定义和类路径中的类并不存在。

  2. java lang .NoClassDefFoundError 此异常指示JVM看个究竟其内部类定义在类的定义的数据结构并没有找到它。 这不同于说,故未能加载的类路径中。 通常这表示我们曾试图从类路径中加载类,但出于某种原因而失败现在我们再试一次,但我们根本不会去尝试加载它,因为我们失败之前将其加载。 之前的失败可能是ClassNotFoundException或者ExceptionInInitializerError静态初始化块中( 表示失败) 或者任意数量的其他问题。 我要说的是NoClassDefFoundError不一定是类路径问题。


我发现此说明从 ( http://stackoverflow .com/a/5756989/1697099 )

原作者:
0 0

根据stacktrace,一个别人替代类com .intuit .ipp .aggcat .util .SAML2AssertionGenerator需要saml jar在classpath上。

saml类org .opensaml xml .XMLConfigurator需要上则把log4J,这里面是WAR但发现不了。

这是该类的一个理由XMLConfigurator有待发现log4J不是WAR内部,但是在下一级classloader 。 找一个saml jar中丢失WAR?

类XMLConfigurator需要log4J发现不了级别的classloader加载它的,和log4j版本在WAR上不可见该特定类加载器。

为了解决此问题,一种方法是添加这个OAuth之前调用:

System.out.println("all versions of log4j Logger: " + getClass().getClassLoader().getResources("org/apache/log4j/Logger.class") );
System.out.println("all versions of XMLConfigurator: " + getClass().getClassLoader().getResources("org/opensaml/xml/XMLConfigurator.class") );
System.out.println("all versions of XMLConfigurator visible from the classloader of the OAuthAuthorizer class: " + OAuthAuthorizer.class.getClassLoader().getResources("org/opensaml/xml/XMLConfigurator.class") );
System.out.println("all versions of log4j visible from the classloader of the OAuthAuthorizer class: " + OAuthAuthorizer.class.getClassloader().getResources("org/apache/log4j/Logger.class") );

同样的,如果你使用的是Java 7,看看 jHades,是我做了一个工具来帮助解决这些类型的问题。

为了了解所发生的事情,你能post classpath上面查询的结果,为其容器会发生这种事,tomcat jetty? 最好把完整的stacktrace,简直由于在pastebin,以防万一

原作者:
0 0

与建议@jhadesdev和向别人解释,我找到问题在这里

添加代码以找到答案后对各种类加载器可见我还找到这个

All versions of log4j Logger: 
  zip:<snip>war/WEB-INF/lib/log4j-1.2.17.jar!/org/apache/log4j/Logger.class
All versions of log4j visible from the classloader of the OAuthAuthorizer class: 
  zip:<snip>war/WEB-INF/lib/log4j-1.2.17.jar!/org/apache/log4j/Logger.class
All versions of XMLConfigurator: 
  jar:<snip>com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class
All versions of XMLConfigurator visible from the classloader of the OAuthAuthorizer class: 
  jar:<snip>com.bea.core.bea.opensaml2_1.0.0.0_6-1-0-0.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/ipp-java-aggcat-v1-devkit-1.0.2.jar!/org/opensaml/xml/XMLConfigurator.class
  zip:<snip>war/WEB-INF/lib/xmltooling-1.3.1.jar!/org/opensaml/xml/XMLConfigurator.class

我注意到的另一个版本XMLConfigurator很可能是火起来 我反编译这个类并发现了这个在第60 ( 其中中的错误是原始堆栈跟踪) private static final Logger log = Logger.getLogger(XMLConfigurator.class);这个事实类过来: org.apache.log4j.Logger!

所以,是这个类被加载和使用。 我修复是重命名此文件作为包含jar文件我找不到哪里直接或间接加载它。 这可能导致出现问题时实际部署。

感谢所有帮助和类加载上了急需教训。

原作者:
0 0

java lang .ClassNotFoundException是指示类中找不到类路径。 可能是log4J的版本不兼容。 检查不同log4J版本。

原作者:
0 0

可以使用以下maven依赖在pom文件中。 否则,你可以下载以下两个jar与net并将其添加到构建路径。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.4</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
</dependency>

这是复制从我的工作项目。 首先确保该页正常工作到项目中。 则可以将版本更改为使用任何other(版本) 兼容的jars 。

对于AggCat,你可以引用的POM文件示例Java应用。

https://github .com/IntuitDeveloperRelations/IPP_Sample_Code/blob/master/CustomerAccountData/Java/AggCatSampleApplication/pom 。xml

谢谢

原作者:
0 0

遇到了同样的问题,这实在是造成WebLogic愚蠢地使用自己的opensaml实现。 问题解决,再写要从中加载类 WEB-INF/lib为此包 weblogic.xml:

    <prefer-application-packages>
        <package-name>org.opensaml.*</package-name>
    </prefer-application-packages>

也许 <prefer-web-inf-classes>true</prefer-web-inf-classes>将会工作得。

原作者:
...