Pertanyaan Disebabkan Oleh: java.lang.NoClassDefFoundError: org / apache / log4j / Logger


Saya punya masalah yang menarik di mana kelas org.apache.log4j.Logger tidak ditemukan selama waktu proses. Saya mencoba mendapatkan otorisasi dan disitulah gagal:

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

Saya menggunakan JDeveloper 11.1.1.6. Inilah yang saya tahu:

  1. Saya telah melihat di direktori UI.war / WEB-INF / lib saya dan saya melihat log4j-1.2.17.jar di sana.

  2. Kelas yang mengeluhkannya adalah 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
    
  3. Saya mendekompilasi XMLConfigurator dan anehnya itu tidak mengimpor org.apache.log4j.Logger Ini menggunakan org.slf4j.Logger yang juga ada di direktori jars saya (slf4j-api-1.7.5.jar). Juga menarik adalah bahwa garis 60 (lihat jejak stack) adalah garis kosong dalam dekompilasi saya.

  4. Tentu saja jika saya menambahkan Logger.xxxxx selama waktu desain, itu akan baik-baik saja.

  5. Saya menggunakan kode / guci langsung dari kode java contoh, tetapi diimpor ke dalam aplikasi saya yang sudah ada.

Saya telah menjelajahi web untuk jawaban dan saya yakin saya telah memeriksa semua area yang dapat saya pikirkan. Saya juga mereferensikan halaman yang sangat bagus ini: http://myarch.com/classnotfound/

Otorisasi yang diberikan adalah langkah 1 dalam menggunakan API Pengembang Intuit, saya agak terjebak.

Menambahkan output dari saran @jhadesdev:

Semua versi 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

Semua versi log4j terlihat dari classloader kelas 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.jar! /Org/apache/log4j/Logger.class

Semua versi 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

Semua versi XMLConfigurator terlihat dari kelas loader kelas OAuthAuthorizer:

  • 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

Saya masih berusaha menafsirkan hasilnya.


32
2018-01-03 17:34


asal


Jawaban:


Selama waktu proses aplikasi Anda tidak dapat menemukan toples.

Diambil dari jawaban ini oleh Jared:

Penting untuk menjaga dua pengecualian yang berbeda di kepala kita   pada kasus ini:

  1. java.lang.ClassNotFoundException Ini sebuah Exception, itu menunjukkan bahwa   kelas tidak ditemukan di classpath. Ini menunjukkan bahwa kami   mencoba memuat definisi kelas, dan kelas tidak ada   classpath.

  2. java.lang.NoClassDefFoundError Ini adalah Error, ini menunjukkan bahwa JVM       melihat dalam struktur data definisi kelas internal untuk       definisi kelas dan tidak menemukannya. Ini berbeda dari       mengatakan bahwa itu tidak dapat diambil dari classpath. Biasanya ini       menunjukkan bahwa sebelumnya kami mencoba memuat kelas dari       classpath, tetapi gagal untuk beberapa alasan - sekarang kami mencoba lagi,       tetapi kami bahkan tidak akan mencoba untuk memuatnya, karena kami gagal       memuatnya sebelumnya. Kegagalan sebelumnya bisa menjadi a       ClassNotFoundException atau ExceptionInInitializerError (menunjukkan       kegagalan dalam blok inisialisasi statis) atau sejumlah lainnya       masalah. Intinya adalah, NoClassDefFoundError belum tentu a       masalah classpath.

untuk persamaan dan perbedaan 


24
2018-01-03 17:45



Anda dapat menggunakan ketergantungan maven berikut ini dalam file pom Anda. Jika tidak, Anda dapat mengunduh dua guci berikut dari net dan menambahkannya ke jalur build Anda.

<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>

Ini disalin dari proyek kerja saya. Pertama pastikan itu bekerja di proyek Anda. Kemudian Anda dapat mengubah versi untuk menggunakan guci lain yang kompatibel (versi).

Untuk AggCat, Anda bisa merujuk file POM dari contoh aplikasi java.

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

Terima kasih


5
2018-01-03 18:41



Berdasarkan stacktrace, kelas intuit com.intuit.ipp.aggcat.util.SAML2AssertionGenerator membutuhkan toples saml di classpath.

Kebutuhan org.opensaml.xml.XMLConfigurator kelas saml dibutuhkan pada giliran log4j, yang ada di dalam PERANG tetapi tidak dapat menemukannya.

Satu penjelasan untuk ini adalah bahwa class XMLConfigurator yang membutuhkan log4j tidak ditemukan di dalam WAR tetapi pada classloader downstream. bisakah tabung saml hilang dari PERANG?

Kelas XMLConfigurator yang membutuhkan log4j tidak dapat menemukannya di level classloader yang memuatnya, dan versi log4j pada PERANG tidak terlihat pada classloader tertentu.

Untuk memecahkan masalah ini, cara adalah dengan menambahkan ini sebelum panggilan 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") );

Juga jika Anda menggunakan Java 7, lihatlah jHades, ini adalah alat yang saya buat untuk membantu memecahkan masalah semacam ini.

Untuk melihat apa yang sedang terjadi, bisakah Anda memposting hasil kueri classpath di atas, untuk wadah apa ini terjadi, tomcat, jetty? Akan lebih baik untuk menempatkan stacktrace penuh dengan semua yang disebabkan oleh di pastebin, berjaga-jaga.


4
2018-01-03 19:22



Periksa di Majelis Penerapan,

Saya memiliki kesalahan yang sama, ketika saya menghasilkan file perang dengan "maven clean install" cara dan menyebarkan manual, ia berfungsi dengan baik, tetapi ketika saya menggunakan runtime enviroment (gerhana) masalah datang.

Solusi untuk saya (untuk Eclipse IDE) pergi ke: "proyect properties" -> "Deployment Assembly" -> "Add" -> "the jar you need", dalam kasus saya java "build path entries". Mungkin bisa membantu sedikit!


4
2017-11-07 01:31



Dengan saran @jhadesdev dan penjelasan dari orang lain, saya telah menemukan masalah di sini.

Setelah menambahkan kode untuk melihat apa yang terlihat oleh berbagai loader kelas, saya menemukan ini:

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

Saya perhatikan bahwa XMLConfigurator versi lain kemungkinan akan diambil. Saya mendekompilasi kelas itu dan menemukan ini di baris 60 (di mana kesalahan berada di jejak stack asli) private static final Logger log = Logger.getLogger(XMLConfigurator.class); dan kelas itu mengimpor dari org.apache.log4j.Logger!

Jadi kelas inilah yang sedang dimuat dan digunakan. Perbaikan saya adalah mengganti nama file jar yang berisi file ini karena saya tidak dapat menemukan di mana saya secara eksplisit atau tidak langsung memuatnya. Yang mungkin menimbulkan masalah ketika saya benar-benar menyebarkan.

Terima kasih atas semua bantuan dan pelajaran yang sangat dibutuhkan tentang pemuatan kelas.


3
2018-01-03 21:48



Punya masalah yang sama, itu memang disebabkan oleh weblogic bodoh menggunakan implementasi opensaml sendiri. Untuk mengatasinya, Anda harus memberitahukannya untuk memuat kelas dari WEB-INF/libuntuk paket ini di weblogic.xml:

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

mungkin <prefer-web-inf-classes>true</prefer-web-inf-classes> akan bekerja juga.


2
2018-05-05 07:05



java.lang.ClassNotFoundException menunjukkan bahwa kelas tidak ditemukan di jalur kelas. bisa jadi versi log4j tidak kompatibel. periksa versi log4j yang berbeda.


1
2018-01-03 17:51