Java.lang.NoClassDefFoundError कैसे हल करें: जावा 9 में javax / xml / bind / JAXBException


842

मेरे पास कुछ कोड हैं जो JAXB API क्लासेस का उपयोग करते हैं जिन्हें जावा 6/7/8 में JDK के एक भाग के रूप में प्रदान किया गया है। जब मैं जावा 9 के साथ एक ही कोड चलाता हूं, तो रनटाइम में मुझे यह संकेत मिलता है कि JAXB कक्षाएं नहीं मिल सकती हैं।

JAXB कक्षाएं जावा 6 के बाद से JDK के एक भाग के रूप में प्रदान की गई हैं, इसलिए Java 9 अब इन कक्षाओं को क्यों नहीं खोज सकता है?


2
इस उत्तर में अतिरिक्त हिस्सा इन एपीआई के प्रवास से संबंधित है।
नमन

7
जावा 8 के साथ निर्माण करने पर आपका कोड हां को संकलित करने के लिए मिल जाएगा, लेकिन जब आप जावा 9+ पर उस संकलित कोड को चलाने का प्रयास करेंगे तो यह विफल हो जाएगा क्योंकि JAX-B मौजूद नहीं है।
एंडी गुइबार्ट

1
जावा 11 के लिए, इस लेख का समाधान आज तक है: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext
Eric Wang

जवाबों:


1222

JAXB एपीआई को जावा ईई एपीआई माना जाता है और इसलिए अब जावा एसई 9 में डिफ़ॉल्ट क्लासपाथ पर निहित नहीं हैं। जावा 11 में, उन्हें पूरी तरह से जेडीके से हटा दिया जाता है।

जावा 9 मॉड्यूल की अवधारणाओं का परिचय देता है, और डिफ़ॉल्ट रूप से, java.seसमग्र मॉड्यूल क्लासपैथ (या बल्कि, मॉड्यूल-पथ) पर उपलब्ध है। जैसा कि नाम से पता चलता है, java.seकुल मॉड्यूल में जावा ईई एपीआई शामिल नहीं है जो परंपरागत रूप से जावा 6/7/8 के साथ बंडल किया गया है।

सौभाग्य से, ये Java EE API जो JDK 6/7/8 में प्रदान किए गए थे, अभी भी JDK में हैं, लेकिन वे अभी डिफ़ॉल्ट रूप से क्लासपाथ पर नहीं हैं। अतिरिक्त जावा ईई एपीआई निम्नलिखित मॉड्यूल में प्रदान किए जाते हैं:

java.activation
java.corba
java.transaction
java.xml.bind  << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation

त्वरित और गंदा समाधान: (केवल JDK 9/10)

JAXB API को रनटाइम पर उपलब्ध कराने के लिए, निम्न कमांड-लाइन विकल्प निर्दिष्ट करें:

--add-modules java.xml.bind

लेकिन मुझे अभी भी जावा 8 के साथ काम करने की आवश्यकता है !!!

यदि आप --add-modulesएक पुराने JDK के साथ निर्दिष्ट करने का प्रयास करते हैं , तो यह उड़ जाएगा क्योंकि यह एक अपरिचित विकल्प है। मैं दो विकल्पों में से एक का सुझाव देता हूं:

  1. आप JDK_JAVA_OPTIONSपर्यावरण चर का उपयोग करके कोई भी जावा 9+ केवल विकल्प सेट कर सकते हैं । यह वातावरण चर जावा 9+ के लिए लॉन्चर द्वारा स्वचालित रूप से पढ़ा जाता है java
  2. आप -XX:+IgnoreUnrecognizedVMOptionsजेवीएम को चुपचाप उड़ाने के बजाय गैर-मान्यता प्राप्त विकल्पों को अनदेखा करने के लिए जोड़ सकते हैं । मगर सावधान! आपके द्वारा उपयोग की जाने वाली कोई भी अन्य कमांड-लाइन तर्क JVM द्वारा आपके लिए मान्य नहीं होगी। यह विकल्प Oracle / OpenJDK के साथ-साथ IBM JDK (JDK 8sr4 के रूप में) के साथ काम करता है।

वैकल्पिक त्वरित समाधान: (केवल JDK 9/10)

ध्यान दें कि आप --add-modules java.se.eeविकल्प निर्दिष्ट करके रन टाइम पर उपरोक्त सभी जावा ईई मॉड्यूल उपलब्ध करा सकते हैं । java.se.eeमॉड्यूल एक समग्र मॉड्यूल शामिल है java.se.eeऔर साथ ही ऊपर जावा ईई एपीआई मॉड्यूल। ध्यान दें, यह जावा 11 पर काम नहीं करता है क्योंकि जावा 11java.se.ee में हटा दिया गया था।


उचित दीर्घकालिक समाधान: (JDK 9 और उससे आगे)

ऊपर सूचीबद्ध जावा ईई एपीआई मॉड्यूल सभी चिह्नित हैं @Deprecated(forRemoval=true)क्योंकि वे जावा 11 में हटाने के लिए निर्धारित हैं । इसलिए अब दृष्टिकोण जावा 11 के आउट-ऑफ-द-बॉक्स में काम नहीं करेगा।--add-module

आपको जावा 11 में क्या करने की आवश्यकता है और आगे वर्गपथ या मॉड्यूल पथ पर जावा ईई एपीआई की अपनी प्रति शामिल है। उदाहरण के लिए, आप JAX-B API को इस तरह मावेन निर्भरता के रूप में जोड़ सकते हैं:

<!-- API, java.xml.bind module -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime, com.sun.xml.bind module -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>

देखें JAXB संदर्भ कार्यान्वयन पेज JAXB बारे में अधिक जानकारी के लिए।

जावा मॉड्यूलरिटी पर पूर्ण विवरण के लिए, JEP 261: मॉड्यूल सिस्टम देखें

ग्रेडेल या Android स्टूडियो डेवलपर के लिए: (JDK 9 और उससे आगे)

अपनी build.gradleफ़ाइल में निम्न निर्भरताएँ जोड़ें :

dependencies {
    // JAX-B dependencies for JDK 9+
    implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
    implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}

8
इसलिए यदि जावा ईई एपीआई मॉड्यूल को चिह्नित किया जाता है तो इसका मतलब यह है कि यह संभावना है कि जावा 10 में जेएसीबी अब जावा 10 में रनटाइम पर उपलब्ध नहीं होगा? यह एक कदम पीछे की तरह लगता है। हमें JAXB को एक निर्भरता के रूप में शामिल करने के पूर्व -6 अभ्यास पर वापस जाना होगा।
माइकल

4
का उपयोग कर --add- मॉड्यूल java.se.ee या --add- मॉड्यूल सब-सिस्टम को वर्कअराउंड के रूप में माइग्रेशन गाइड के अनुसार अनुशंसित नहीं किया जाता है यहां docs.oracle.com/javase/9/migrate अनुभाग मॉड्यूल के तहत जावा EE के साथ साझा किया गया है। डिफ़ॉल्ट द्वारा हल -> बिंदु 1
justMe

6
जावा 10 आधिकारिक तौर पर जारी होने के साथ, हम पुष्टि कर सकते हैं कि ऐड-मॉड्यूल विधि अभी भी काम करेगी। javax.xml.bindऔर अन्य JavaEE कक्षाएं प्रति, जावा 11 में हटाने के लिए निर्धारित हैं JEP-320
जोएप वीजर्स

10
और अब जावा 11 जारी किया गया है और java.se.eeमॉड्यूल को हटा दिया गया है, इसलिए --add-modulesसमाधान अब काम नहीं करता है। इसके बजाय अनुशंसित समाधान का उपयोग करें: JAXB को एक अलग निर्भरता के रूप में जोड़ें।
जेस्पर

11
मैंने इन निर्भरताओं को जोड़ा है और यह अभी भी मुझे वही त्रुटि दे रही है। किसी भी विचार क्यों?
जोहो विएरा

262

मेरे मामले में (वसंत बूट वसा जार) मैं बस निम्नलिखित pom.xml को जोड़ता हूं।

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

10
बस संदर्भ के लिए github.com/spring-projects/spring-boot/wiki/…
टुनो

9
इस तरह से निर्भरता जोड़ना testCompile('javax.xml.bind:jaxb-api')मेरे लिए काम कर गया।
pamcevoy

5
जैसे @pamcevoy ने उल्लेख किया है, स्प्रिंग बूट का उपयोग करते समय jaxb-api के संस्करण को निर्दिष्ट करने की आवश्यकता नहीं है। बूट स्वचालित रूप से संस्करण का प्रबंधन करता है।
मार्सेल ओवरडिज्क

2
मैं <scope>runtime</scope>ऐसे मामले के लिए उपयोग करने का सुझाव देता हूं
व्लादस

5
@ टुनो के लिंक ने मेरे लिए काम नहीं किया, निश्चित लिंक है: github.com/spring-projects/spring-boot/wiki/…
फ्रांसिस्को मटेओ

69

हाल के JDK 9.0.1 में इनमें से किसी भी समाधान ने मेरे लिए ठीक काम नहीं किया।

मैंने पाया कि निर्भरता की यह सूची एक उचित कार्य के लिए पर्याप्त है, इसलिए आपको स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है--add-module (हालांकि यह इन निर्भरता के पोम के भीतर निर्दिष्ट है)। केवल आपको निर्भरता की इस सूची को निर्दिष्ट करने की आवश्यकता है:

<dependencies>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
</dependencies>

2
JDK 8 के लिए, ऊपर से jaxb-core और jaxb-impl निकालें।
फू

3
@ अनिल यह pom.xmlमावेन विन्यास की एक फ़ाइल है। यदि आप नहीं जानते कि वह क्या है, तो
भीख मांगना

8
अवैध चिंतनशील एक्सेस ऑपरेशन हुआ है: कॉम .sun.xml.bind.v2.runtime.reflect.opt.Injector (फ़ाइल: / C: /Users/.mis/.m2/repository/com/sun/ द्वारा अवैध चिंतनशील पहुंच xml / bind / jaxb-impl / 2.3.0 / jaxb-impl-2.3.0.jar) विधि java.lang.ClassLoader.defineClass (java.lang.String, byte [], int, int) चेतावनी: कृपया विचार करें: com.sun.xml.bind.v2.runtime.reflect.opt.Injector चेतावनी के रख-रखाव के लिए इसकी रिपोर्ट करना: उपयोग करना --illegal-access = आगे अवैध चिंतनशील संचालन की चेतावनी को सक्षम करने के लिए चेतावनी चेतावनी: सभी अवैध पहुँच संचालन होंगे एक भविष्य के रिलीज में इनकार कर दिया
स्टीफन

1
यह मेरे लिए JDK 9.0.4 पर काम किया (मैं मावेन 3.5.3 के साथ मावेन प्लगइन के माध्यम से JAXB संबंधित कोड कह रहा था)। हालांकि मैं <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>अंतिम निर्भरता के रूप में उपयोग करूंगा ।
स्क्रूटरी

1
बहुत बढ़िया। मेरे पास एक ऐसी स्थिति थी जहां - किसी कारण से - एक स्प्रिंग बूट ऐप intelij CE में चलेगा, लेकिन मैक पर ग्रहण नहीं, और ग्रहण में, लेकिन win10 पर intellij CE नहीं। दो प्लेटफार्मों पर एक आईडीई में काम करने में सक्षम होना एक फायदा है।
'13

42

यह मेरे लिए काम किया:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.7.0</version>
</dependency>

अपडेट करें

जैसा कि @ जैस्पर ने सुझाव दिया था, संपूर्ण ग्रहण लाइब्रेरी के आधार पर बचने के लिए, आप सिर्फ एक्लिप्सिंक MOXy पर निर्भर रह सकते हैं:

Maven

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.moxy</artifactId>
    <version>2.7.3</version>
</dependency>

Gradle

compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'

मेरे जावा 8 ऐप के लिए निर्भरता के रूप में, जो एक * .jar का उत्पादन करता है जिसे जेआरई 8 या जेआरई 9 दोनों द्वारा चलाया जा सकता है जिसमें कोई अन्य तर्क नहीं है।

इसके अलावा, JAXB API का उपयोग करने से पहले इसे कहीं न कहीं निष्पादित किया जाना चाहिए:

System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");

वर्कअराउंड के रूप में अब तक बहुत अच्छा काम करता है। हालांकि एक सही समाधान की तरह नहीं दिखता है ...


5
org.eclipse.persistence:eclipselinkसिर्फ JAXB API प्राप्त करने के लिए जोड़ना बहुत भारी-वजन पर निर्भरता है, जब तक कि आप पहले से ही eclipselink का उपयोग नहीं कर रहे हैं?
एंडी गुइबार्ट 18

4
हाँ यह भारी (~ 9mb) है और हाँ मैं पहले से ही इसका उपयोग कर रहा हूँ। मैंने उल्लेख किया है कि यह केवल उन लोगों के लिए एक वैकल्पिक समाधान है, जो शायद अस्थायी हैं, दोनों को कमांड लाइन तर्क प्रदान किए बिना एक ही जार / युद्ध के लिए 8 और 9 जेआरई दोनों का उपयोग करना होगा।
मिखाइल खोलोडकोव

2
JDK 8 और 9 के बीच इंटरॉप के लिए, मैं -XX:+IgnoreUnrecognizedVMOptionsकमांड लाइन विकल्प (विवरण के साथ मेरे उत्तर को अद्यतन करने) का उपयोग करने की सिफारिश करूंगा
एंडी गुइबार्ट

System.setProperty ("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); मेरे लिए काम नहीं करता है
डेविड ब्रॉस्र्ड

1
संपूर्ण EclipseLink लाइब्रेरी के आधार पर बचने के लिए, आप केवल EclipseLink MOXy: groupId org.eclipse.persistence, विरूपण साक्ष्य पर निर्भर कर सकते हैं org.eclipse.persistence.moxy
जेस्पर

36

सभी JDKs> = 9 के लिए स्वच्छ समाधान

आपको अपने निर्माण में दो निर्भरताएं जोड़ने की आवश्यकता है

  • जक्सब-आपी
  • एक jaxb कार्यान्वयन

एक कार्यान्वयन के रूप में मैंने पुरानी कॉम.सुन कक्षाओं / पुस्तकालयों से छुटकारा पाने के लिए ग्लासफिश द्वारा संदर्भ कार्यान्वयन का उपयोग करने के लिए चुना। इसलिए परिणामस्वरूप मैंने अपने मावेन बिल्ड में जोड़ा

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.1</version>
</dependency>

<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.1</version>
</dependency>

ध्यान दें कि संस्करण 2.3.1 से आपको अब javax.activation जोड़ने की आवश्यकता नहीं है। (देखें https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )


क्या javax.xml.bind मॉड्यूल वास्तव में आवश्यक है? JDK 11 में मेरा कोड इसके बिना काम करता है।
k.liakos

@ k.liakos मुझे यकीन नहीं है। जक्सब-रनटाइम जार और एपी-जार समान कक्षाएं / पैकेज साझा नहीं करते हैं। मुझे लगता है कि यह आपके कोड पर निर्भर करता है। यदि आपका कोड 'javax.xml.bind' पैकेज से कक्षाओं का उपयोग नहीं करता है, तो आपको शायद इसकी आवश्यकता नहीं है। इस सूत्र का विषय यह है कि 'javax / xml / bind / JAXBException' नहीं मिल सकता है; यह वर्ग केवल jaxb-api में है।
सेबस्टियन थेस

1
जावा 12 में मल्टी-मॉड्यूल प्रोजेक्ट के साथ पूरी तरह से काम करता है
हेरिल मुराटोविक

35

यह इसलिए है क्योंकि जावा संस्करण यदि आप jdk 9 या बाद के संस्करण का उपयोग कर रहे हैं तो इसे अपने पोम में जोड़ें

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency>

1
मैं इसे स्प्रिंग बूट गाइड के साथ हर समय चलाता हूं ... धन्यवाद एक टन।
मास्टरएक्सिलो

2
@ केसर रोड्रिग्ज टी, मैंने इसे एक स्वैगर उदाहरण के साथ आज़माया और संकलन का काम किया, लेकिन रनिंग ने त्रुटियां दीं। मैंने चयनित उत्तर का उपयोग किया जिसमें अधिक निर्भरता शामिल थी और जो काम करता था।
PatS

अपने प्रोजेक्ट के pom.xml फ़ाइल पर
सीजर रोड्रिगेज टी

22

इसे हल करने के लिए, मैंने अपनी परियोजना में कुछ JAR फाइलें आयात की हैं:

  • javax.activation-1.2.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar

  • JAXB-api-2.3.0.jar

http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar

  • JAXB कोर-2.3.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar

  • JAXB-impl-2.3.0.jar

http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar

  1. फ़ाइलों के ऊपर डाउनलोड करें और उन्हें प्रोजेक्ट में libs फ़ोल्डर में कॉपी करें
  2. जावा बिल्ड पाथ में आयातित JAR फाइलें जोड़ें

4
ध्यान दें कि com.sun.xml.bindकलाकृतियां पुरानी हैं और केवल पिछड़े संगतता के लिए प्रदान की जाती हैं। आपको org.glassfish.jaxbइसके बजाय समकक्ष कलाकृतियों का उपयोग करना चाहिए , जैसा कि कुछ अन्य उत्तरों में वर्णित है।
जेस्पर

यह मेरे लिए काम नहीं किया। यह एक त्रुटि थी, और कहा कि यह एक विशेष वर्ग नहीं मिल सकता है।
RamenChef

मेरे लिए काम किया जब मैंने उन्हें टकसाल 9 / लिबास फ़ोल्डर में मिंट 19.2 (उबंटू 18.04 बेस) के तहत रखा, जब एक ग्रेल्स 3.4.10 एप्लिकेशन को तैनात किया।
मोहम्मद फकीह

18

संकलन के समय के साथ-साथ चलाने का समय, स्विच जोड़ें --add-modules java.xml.bind

javac --add-modules java.xml.bind <java file name>

java --add-modules java.xml.bind <class file>

JDK 9मॉड्यूल का एक अच्छा परिचय यहां भी पाया जा सकता है: https://www.youtube.com/watch?v=KZfbRuvv5qc


11

इसने मेरे लिए काम किया। केवल jaxb-api जोड़ना पर्याप्त नहीं था।

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>${jaxb-api.version}</version>
        </dependency>

और jaxb-api.version क्या सेट किया गया था?
मिगेलमुनोज

@ मिगेलमुनोज मैंने २.२.
श्री जेडी

2
ध्यान दें कि com.sun.xml.bindकलाकृतियां पुरानी हैं और केवल पिछड़े संगतता के लिए प्रदान की जाती हैं। आपको org.glassfish.jaxbइसके बजाय समकक्ष कलाकृतियों का उपयोग करना चाहिए , जैसा कि कुछ अन्य उत्तरों में वर्णित है।
जेस्पर

11

अपने बिल्ड.ग्रेड पर जाएं और जावा 9 या जावा 10 दोनों के लिए निर्भरता नीचे जोड़ें।

sourceCompatibility = 10 // You can also decrease your souce compatibility to 1.8 

//java 9+ does not have Jax B Dependents

    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
    compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
    compile group: 'javax.activation', name: 'activation', version: '1.1.1'

11

आप --add-modules=java.xml.bindJVM रन-टाइम वातावरण में xml बाइंड मॉड्यूल जोड़ने के लिए JVM विकल्प का उपयोग कर सकते हैं ।

उदाहरण के लिए: java --add-modules=java.xml.bind XmlTestClass


11

अप्रैल 2019 को अपडेट करें

JAXB रिलीज़ के लिए चांगलांग, https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html पर है

अंश:

    4.1. Changes between 2.3.0.1 and 2.4.0

         JAXB RI is now JPMS modularized:

            All modules have native module descriptor.

            Removed jaxb-core module, which caused split package issue on JPMS.

            RI binary bundle now has single jar per dependency instead of shaded fat jars.

            Removed runtime class weaving optimization.

    4.2. Changes between 2.3.0 and 2.3.0.1

          Removed legacy technology dependencies:

            com.sun.xml.bind:jaxb1-impl

            net.java.dev.msv:msv-core

            net.java.dev.msv:xsdlib

            com.sun.xml.bind.jaxb:isorelax

    4.3. Changes between 2.2.11 and 2.3.0

          Adopt Java SE 9:

            JAXB api can now be loaded as a module.

            JAXB RI is able to run on Java SE 9 from the classpath.

            Addes support for java.util.ServiceLoader mechanism.

            Security fixes

आधिकारिक लिंक https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts पर है

JAXB कलाकृतियों के लिए मावेन निर्देशांक

jakarta.xml.bind: jakarta.xml.bind-api: JAXB के लिए एपीआई कक्षाएं। JAXB के खिलाफ संकलन करने के लिए आवश्यक है।

org.glassfish.jaxb: jaxb-runtime: JAXB के कार्यान्वयन, क्रमांकन और deserialization जावा वस्तुओं के लिए / xml से उपयोग किया जाता है।

JAXB वसा-जार बंडल:

com.sun.xml.bind: jaxb-impl: JAXB रनटाइम वसा जार।

Org.glassfishfish.jaxb कलाकृतियों के विपरीत, इन जार में सभी निर्भरता वर्ग शामिल हैं। इन कलाकृतियों में जेपीएमएस मॉड्यूल विवरणक नहीं होते हैं। मावेन परियोजनाओं में org.glassfish.jaxb कलाकृतियों को इसके बजाय इस्तेमाल किया जाना चाहिए।

org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 पुल इन:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
[INFO] |  +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO] |  +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
[INFO] |  +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
[INFO] |  +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
[INFO] |  \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile

मूल उत्तर

के बाद कौन सा कलाकृतियों मैं अपने Maven परियोजना में JAXB आरआई के लिए इस्तेमाल करना चाहिए? मावेन में, आप एक प्रोफ़ाइल का उपयोग कर सकते हैं जैसे:

<profile>
    <id>java-9</id>
    <activation>
        <jdk>9</jdk>
    </activation>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
</profile> 

निर्भरता ट्री शो:

[INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
[INFO] |  +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
[INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
[INFO] |  |  +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
[INFO] |  |  \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
[INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
[INFO] |  \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
[INFO] \- javax.activation:activation:jar:1.1.1:compile

ग्रहण में इसका उपयोग करने के लिए, Oxygen.3a रिलीज़ (4.7.3a) या बाद में, Ctrl-Alt-P, या प्रोजेक्ट पर राइट-क्लिक करें, Maven, फिर प्रोफ़ाइल का चयन करें।


यह दिखाने के लिए धन्यवाद कि मैं के लिए एक निर्भरता javax.xml.bind> jaxb-apiजो मैंने कहीं और देखी है, वास्तव में बेमानी है। ग्लासफिश की निर्भरता इसे खींचती है। मैंने बस कोशिश की, और यह वास्तव में काम करता है।
बेसिल बॉर्क

8

जावा वेब प्रारंभ निष्पादन के लिए हम एंडी गुइबार्ट के सुझाव का उपयोग इस प्रकार कर सकते हैं:

<j2se version="1.6+" 
      java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>

अतिरिक्त "=" नोट करें - एडड-मॉड्यूल में। इस OpenJDK टिकट को देखें या जावा प्लेटफॉर्म के "अंडरस्टैंडिंग रनटाइम एक्सेस वार्निंग" में अंतिम नोट , स्टैंडर्ड एडिशन Oracle JDK 9 माइग्रेशन गाइड


8

pav.xml में javax.xml.bind निर्भरता जोड़ें

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

8

चूंकि JavaEE अब https://jakarta.ee/ द्वारा शासित है , इसलिए 2.3.2 के रूप में नए मावेन निर्देशांक हैं:

https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts

पहला रिलीज़ किया गया jaxb.version 2.3.2 है।

<properties>
  <jaxb.version>2.3.2</jaxb.version>
</properties>

<dependency>
  <groupId>jakarta.xml.bind</groupId>
  <artifactId>jakarta.xml.bind-api</artifactId>
  <version>${jaxb.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>${jaxb.version}</version>
</dependency>

7

मैंने इस URL का अनुसरण किया और नीचे की सेटिंग्स ने वास्तव में मेरी मदद की। मैं मैकबुक प्रो में एसटीएस आईडीई के साथ जावा 10 का उपयोग करता हूं। यह एक सम्मोहन की तरह काम करता है।

   <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>javax.activation-api</artifactId>
    <version>1.2.0</version>
</dependency>

7

इसने जावा 12 पर Apache Camel 2.24.1 पर चलने वाली निर्भरता के साथ मेरी समस्याओं को हल किया:

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0.1</version>
    </dependency>

मेरे मामले में मुझे pom फ़ाइल में tomcat निर्भरता जोड़ने की जरूरत है
GvSharma

6

मुझे 2.0.5.RELEASEजावा 11 पर स्प्रिंग बूट का उपयोग करके एक ही मुद्दे का सामना करना पड़ा ।

javax.xml.bind:jaxb-api:2.3.0अकेले जोड़ने से समस्या ठीक नहीं हुई। मुझे स्प्रिंग बूट को नवीनतम माइलस्टोन में भी अपडेट करना था 2.1.0.M2, इसलिए मुझे लगता है कि यह अगले आधिकारिक रिलीज में तय किया जाएगा।


यह मुझसे संबंधित ध्वनि नहीं है। इस धागे में कई समाधान हैं जो स्प्रिंग बूट 2 का उपयोग किए बिना काम करते हैं (मैं स्प्रिंग बूट 2.0.5 का उपयोग भी करता हूं। कृपया btw)। शायद स्प्रिंग 2.1.0.M2 में पहले से ही एक जक्सब रनटाइम शामिल है।
सेबेस्टियन थेस

ऐसा लगता है कि स्प्रिंग बूट 2.1.0 के साथ। कृपया, JAXB अब आवश्यक नहीं है - github.com/spring-projects/spring-boot/releases
Burrich

5

JDK 9+ का उपयोग करते समय आपको JAX-B निर्भरता को जोड़ना होगा। एंड्रॉयड स्टूडियो उपयोगकर्ता के लिए, यदि आप अपने को यह जोड़ने की आवश्यकता होगी build.gradleके dependencies {}ब्लॉक:

// Add missing dependencies for JDK 9+
if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
    // If you're using @AutoValue or any libs that requires javax.annotation (like Dagger)
    compileOnly 'com.github.pengrad:jdk9-deps:1.0'
    compileOnly 'javax.annotation:javax.annotation-api:1.3.2'

    // If you're using Kotlin
    kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
    kapt "javax.xml.bind:jaxb-api:2.3.1"
    kapt "com.sun.xml.bind:jaxb-impl:2.3.2"

    // If you're using Java
    annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"

    testAnnotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    testAnnotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
}

हालांकि यूनिट परीक्षणों के लिए काम नहीं करता है
Malachiasz

मैंने आपके उत्तर को इकाई परीक्षणों के साथ-साथ काम करने के लिए संशोधित किया है।
मलयासीज

4

मैंने ClassNotFoundException: javax.xml.bind.DatatypeConverter जावा 11 और

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

मैंने javax.xml.bind: jaxb-api या स्प्रिंग बूट jakarta.xml.bind-api .. को जोड़ने के चारों ओर इस सभी सामान की कोशिश की। मुझे jjwt संस्करण 0.10.0 में सुधार के लिए एक संकेत मिला है .. सबसे महत्वपूर्ण बात, jjwt पैकेज है। अब अलग हो जाओ!

इस प्रकार, इस संदर्भ की जाँच करें: https://github.com/jwtk/jjwt/issues/510

बस, यदि आप उपयोग करते हैं

Java11 और jjwt 0.9.x और आप ClassNotFoundException: javax.xml.bind.DatatypeConverter समस्या का सामना करते हैं।

के लिए जाओ

jjwt संस्करण 0.11.x, लेकिन विभाजित पैकेज का उपयोग करें: https://github.com/jwtk/jjtt#install

जब तक वे संकुल को विभाजित नहीं करते हैं, तब तक आपको jwwt निर्भरता के लिए एक उच्च संस्करण नहीं मिलेगा।

चीयर्स।


3

उत्तर नहीं है, लेकिन एक परिशिष्ट: मुझे मिल रहा है क्योंकि चल रहा है groovysh(ग्रूवी 2.4.13) अगर जावा_होम जावा 9 इंस्टॉलेशन ( java version "9.0.1"सटीक होने के लिए) को इंगित करता है :

java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
        at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
        at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
        at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
        ...
        ..
        .
        ..
        ...
        at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
        at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
        at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more

समाधान यह था:

  • पर जाएं JAXB परियोजना github.io पर ( "- CDDL 1.1 और जीपीएल 2.0 वर्ग पथ अपवाद के साथ JAXB एक दोहरी लाइसेंस के तहत लाइसेंस प्राप्त है" )

  • डाउनलोड jaxb-ri-2.3.0.zip

  • जहाँ भी आप अपने जावा इंफ्रास्ट्रक्चर फाइल (मेरे मामले में /usr/local/java/jaxb-ri/) रखें , अनज़िप करें । अन्य समाधान मौजूद हो सकते हैं (शायद SDKMAN, I dunno के माध्यम से)

  • सुनिश्चित करें कि lib उपनिर्देशिका में जार हैं CLASSPATH। मैं इसे bash स्टार्टअप पर शुरू की गई स्क्रिप्ट के माध्यम से करता हूं, जिसे कहा जाता है /etc/profile.d/java.sh, जहां मैंने निम्नलिखित लूप में (कई अन्य पंक्तियों के बीच) जोड़ा है:

एक समारोह में पैक ...

function extend_qzminynshg {
   local BASE="/usr/local/java"
   for LIB in jaxb-api.jar  jaxb-core.jar  jaxb-impl.jar  jaxb-jxc.jar  jaxb-xjc.jar; do
      local FQLIB="$BASE/jaxb-ri/lib/$LIB"
      if [[ -f $FQLIB ]]; then
         export CLASSPATH=$FQLIB:$CLASSPATH
      fi
    done
}

extend_qzminynshg; unset extend_qzminynshg

और यह काम करता है!


1
मैं downvotzes समझ नहीं है। जाहिरा तौर पर लोग वास्तव में जार पाने के बजाय कमांड-लाइन विकल्पों के साथ फाफ करना चाहते हैं? अपने आप को जो उचित लगे।
डेविड टोनहोफर

7
जावा डेवलपर्स आमतौर पर मैन्युअल रूप से जार डाउनलोड करने के बजाय निर्भरता का प्रबंधन करने के लिए ग्रेडल या मावेन जैसे बिल्ड टूल का उपयोग करते हैं। शायद यही कारण है कि डाउन वोटों का।
जोशुआ डेविस


2

ठीक है, मुझे एक ही तरह का मुद्दा मिल रहा है, लेकिन मैं जावा 8 का उपयोग कर रहा था, और इस त्रुटि को प्राप्त करता रहा, मैंने अधिकांश समाधानों की कोशिश की। लेकिन यह पता चला है कि मेरा मावेन 9 जावा को इंगित कर रहा था, हालांकि मैंने वैश्विक जावा संस्करण 8 से सेट किया था, जैसे ही मैंने तय किया कि यह सब काम कर रहा है।

किसी को भी, जिसे इस तरह की समस्या हो सकती है, डिफ़ॉल्ट जावा का उपयोग करने के लिए मावेन को कैसे ठीक करें , इसकी जांच करें


2

पुराना उत्तर "समस्या का समाधान amazoncorretto पर स्विच करके किया गया" समाचार उत्तर: मैंने नवीनतम corretto का उपयोग किया था, लेकिन यह jdk 1.8 के समान है। तो वैसे भी हमें मैन्युअल रूप से निर्भरताएँ जोड़ने की आवश्यकता है


2
JDK 11 के लिए Amazon Corretto वितरण javax.xml.bind क्लासेस प्रदान नहीं करता है। यदि समस्या को क्रेटो पर स्विच करने के बाद हल किया गया था, तो यह इसलिए था क्योंकि आप जेडीके 8 में डाउनग्रेड किए गए थे
एंडी गुइबर्ट

अजीब, मैं जाँच करूँगा, docker में मैंने correto का नवीनतम प्रयोग किया
Armen Arzumanyan

हाँ, amazoncorretto:latestवर्तमान में JDK 8 देता है, 11 नहीं। कई Docker छवियां अभी भी JDK 8 पर आधारित हैं, ठीक इसके कारण JDK 8 -> 11 के बीच एपीआई हटाने के कारण संगतता मुद्दों के कारण
एंडी गुइबर्ट

2

जावा 8 लक्ष्य के लिए संकलन करते समय मुझे जिस निर्भरता संस्करण का उपयोग करने की आवश्यकता थी। जावा 8, 11 और 12 JRE में आवेदन का परीक्षण किया गया।

        <!-- replace dependencies that have been removed from JRE's starting with Java v11 -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.8</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.8-b01</version>
        </dependency>
        <!-- end replace dependencies that have been removed from JRE's starting with Java v11 -->

2

जावा 11 में मेरे लिए और यह है कि क्या काम किया है:

plugins {
      id 'java'
}

dependencies {
      runtimeOnly 'javax.xml.bind:jaxb-api:2.3.1'
}

वास्तव में हम कहाँ डालते हैं?
nyxee

यदि आप ग्रेडेल का उपयोग कर रहे हैं तो अपनी build.gradle फ़ाइल में।
सिल्वर_एमएक्स

1

आपको मावेन के लिए jaxb निर्भरता जोड़ने की आवश्यकता है। ग्लासफिश कार्यान्वयन संस्करण 2.3.2 नए जकार्ता ईई जक्सब एपी संस्करण 2.3.2 के साथ पूरी तरह से संगत है।

<!-- API -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>

1

मैं अपने प्रोजेक्ट को जावा 11 में अपग्रेड करने के बाद इसी तरह के मुद्दे था, फिर इसे वसंत बूट 2.1.1 में अपग्रेड करने के लिए क्या तय किया गया था जो जाहिरा तौर पर जावा 11 के लिए समर्थन था, इससे मदद मिली


कृपया अपने उत्तर में समाधान के कम से कम हिस्से को जोड़ने पर विचार करें क्योंकि लिंक-केवल उत्तर अमान्य हो जाएंगे यदि भविष्य में url बदलता है।
यक्षिमा हक्षय

0

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन मेरी गलती को एक अलग समाधान की आवश्यकता थी ... सुपर सरल भी

मैं मूल रूप से टॉमकैट 9 में गया और मुझे एहसास हुआ कि मुझे 7 की आवश्यकता है ... मैं बिल्ड में अपना संस्करण 7 के संस्करण में वापस करना चाहता था। xml

उम्मीद है कि यह भविष्य में किसी व्यक्ति की त्रुटि को ठीक करेगा, जो इस सरल मुद्दे को अनदेखा करने का प्रबंधन करता है जैसा मैंने किया था!


2
हालांकि इससे ओपी को मदद मिल सकती है, लेकिन अधिक विवरण, उदाहरण इत्यादि को जोड़ना बेहतर होगा
Tiw

0

यदि आप SOAP वेब सेवाओं को कॉल कर रहे हैं (उदाहरण के लिए, jaxws-maven-pluginइस निर्भरता को जोड़कर) तो सभी JAXB त्रुटियां गायब हो जाती हैं:

<dependency>
            <groupId>org.glassfish.metro</groupId>
            <artifactId>webservices-rt</artifactId>
            <version>2.4.3</version>
</dependency>

जावा 13 के साथ परीक्षण किया गया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.