जावा ईई एपीआई के साथ हटाए गए जेपीएमएस मॉड्यूल के लिए प्रतिस्थापन


183

जावा 9 में छह मॉड्यूल शामिल हैं जिनमें जावा ईई एपीआई शामिल हैं और उन्हें जल्द ही हटा दिया जाएगा:

  • javax.activationपैकेज के साथ जावा
  • java.corba साथ javax.activity, javax.rmi, javax.rmi.CORBA, और org.omg.*संकुल
  • javax.transactionपैकेज के साथ java.transaction
  • java.xml.bind सभी javax.xml.bind.*पैकेजों के साथ
  • java.xml.ws साथ javax.jws, javax.jws.soap, javax.xml.soap, और सभी javax.xml.ws.*संकुल
  • javax.annotationपैकेज के साथ java.xml.ws.annotation

तृतीय-पक्ष की कलाकृतियाँ कौन सी APIs प्रदान करती हैं? इससे कोई फर्क नहीं पड़ता कि वे कितनी अच्छी तरह से उन एपीआई या कौन सी अन्य सुविधाओं की पेशकश करते हैं - जो सभी मायने रखते हैं, क्या वे इन मॉड्यूल / पैकेजों के लिए एक ड्रॉप-इन प्रतिस्थापन हैं?

नॉलेजशील्ड को इकट्ठा करना आसान बनाने के लिए, मैंने अब तक जो भी जाना है, उसका उत्तर दिया और उत्तर को एक सामुदायिक विकि बना दिया। मुझे उम्मीद है कि लोग अपने जवाब लिखने के बजाय इसका विस्तार करेंगे।


इससे पहले कि आप मतदान करें:

  • हां, व्यक्तिगत मॉड्यूल पर पहले से ही कुछ प्रश्न हैं और इस प्रश्न का उत्तर निश्चित रूप से उस जानकारी की नकल करेगा। लेकिन AFAIK इन सभी के बारे में जानने के लिए कोई एकल बिंदु नहीं है, जो मुझे लगता है कि बहुत अधिक मूल्य है।
  • लाइब्रेरी की सिफारिशों के लिए पूछे जाने वाले प्रश्नों को आमतौर पर ऑफ-टॉपिक माना जाता है, क्योंकि "वे अभिमत वाले उत्तर और स्पैम को आकर्षित करते हैं", लेकिन मुझे नहीं लगता कि यह यहां लागू होता है। मान्य पुस्तकालयों के सेट को स्पष्ट रूप से चित्रित किया गया है: उन्हें एक विशिष्ट मानक लागू करना होगा। इससे परे और कुछ भी मायने नहीं रखता है, इसलिए मुझे राय और स्पैम के लिए ज्यादा खतरा नहीं है।

6
आप ज्यादातर उन सभी को मिल सकते हैं जो github.com/javaee के तहत स्थानांतरित हो रहे हैं और JEP 320 की
नमन

InfoWorld, Java रोडमैप में इस 2018-05-14 लेख को भी देखें : ग्रहण का जकार्ता ईई उद्यम जावा पॉल गिल द्वारा आकार लेता है । उपशीर्षक: द एक्लिप्स फाउंडेशन उन 39 परियोजनाओं की रूपरेखा तैयार करता है जो नए क्लाउड-देशी, माइक्रो-सर्विसेज-फ्रेंडली जावा प्रयास का निर्माण करेंगे, और ग्लासफिश कैसे विकसित होगा
तुलसी बोर्ल

2
JDK 11 से इसे हटा दिया गया है। यदि आप jdk 9 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो निर्भरता को सीधे जोड़ना बेहतर है, फिर "--add-मॉड्यूल java.xml.bind" प्रकार का सामान उपयोग करके
Anver Sadhat

जवाबों:


205

बदले गए जावा ईई मॉड्यूल का उपयोग करने के बजाय, निम्नलिखित कलाकृतियों का उपयोग करें।

JAF ( java.activation )

JavaBeans एक्टिवेशन फ्रेमवर्क (अब जकार्ता एक्टिवेशन ) एक स्टैंडअलोन तकनीक है (मावेन सेंट्रल पर उपलब्ध):

<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>jakarta.activation</artifactId>
    <version>1.2.2</version>
</dependency>

( स्रोत )

CORBA ( java.corba )

से JEP 320 :

CORBA का एक स्टैंडअलोन संस्करण नहीं होगा जब तक कि तृतीय पक्ष CORBA APIs, ORB कार्यान्वयन, CosNaming प्रदाता, आदि का रखरखाव नहीं करते हैं, तृतीय पक्ष रखरखाव संभव है क्योंकि Java SE प्लेटफ़ॉर्म CORBA के स्वतंत्र कार्यान्वयन का समर्थन करता है। इसके विपरीत, RMI-IIOP के लिए एपीआई परिभाषित किया गया है और केवल जावा एसई के भीतर लागू किया गया है। RMI-IIOP का एक स्टैंडअलोन संस्करण नहीं होगा, जब तक कि इसे बनाए रखने के लिए एक समर्पित JSR शुरू नहीं किया जाता है, या ग्रहण फाउंडेशन द्वारा एपीआई का नेतृत्व किया जाता है (JCP से ग्रहण फाउंडेशन के लिए जावा EE के स्टीवर्शिप के संक्रमण में GlassFish शामिल है और कोरबा और RMI-IIOP के अपने कार्यान्वयन)।

JTA ( java.transaction )

अकेले खड़े रहो संस्करण:

<dependency>
    <groupId>jakarta.transaction</groupId>
    <artifactId>jakarta.transaction-api</artifactId>
    <version>1.3.3</version>
</dependency>

( स्रोत )

JAXB ( java.xml.bind )

चूँकि जावा EE को जकार्ता EE के साथ मिला दिया गया था , JAXB अब नई कलाकृतियों द्वारा प्रदान किया गया है:

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

<!-- Runtime -->
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.3</version>
    <scope>runtime</scope>
</dependency>

JAXB संदर्भ कार्यान्वयन पृष्ठ

schemagenऔर xjcवहाँ भी एक स्वसंपूर्ण JAXB वितरण के हिस्से के रूप में डाउनलोड किया जा सकता है।

यह भी देखें जुड़ा हुआ जवाब

JAX-WS ( java.xml.ws )

संदर्भ कार्यान्वयन:

<!-- API -->
<dependency>
    <groupId>jakarta.xml.ws</groupId>
    <artifactId>jakarta.xml.ws-api</artifactId>
    <version>2.3.3</version>
</dependency>

<!-- Runtime -->
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.3.3</version>
</dependency>

स्टैंडअलोन वितरण डाउनलोड (होता है wsgenऔर wsimport)।

सामान्य एनोटेशन ( java.xml.ws.annotation )

जावा कॉमन्स एनोटेशन (मावेन सेंट्रल पर उपलब्ध):

<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>1.3.5</version>
</dependency>

( स्रोत )


यदि मॉड्यूल मॉड्यूल jax-wsjdk और com.sun.xml.wsनिर्भरता दोनों से पढ़ता है तो क्या करना है ?
nllsdfx

1
मुझे यकीन नहीं है कि वास्तव में आप क्या पूछ रहे हैं। कौन सा मॉड्यूल jax-ws पढ़ता है? यदि आपके पास मॉड्यूल ग्राफ में java.xml.ws है और वर्ग पथ पर com.sun.xml.ws:jaxws-ri है, तो बाद वाले को अनदेखा किया जाएगा ( विभाजित पैकेजों के कारण )।
निकोलई

वैसे मैं अपने मॉड्यूल के com.sun.xml.ws:jaxws-riबजाय उपयोग करना चाहता java.xml.wsहूं क्योंकि बाद को हटा दिया गया है और हटा दिया जाएगा। और मैंने अपनी पोम फ़ाइल पर निर्भरता को जोड़ा और "मॉड्यूल xyz पैकेज 'javax.xml.ws' को 'java.xml.ws' और 'java.xml.ws' दोनों से पढ़ा।"
nllsdfx

ऐसा लग रहा है कि मॉड्यूल java.xml.ws सभी के बाद हल हो गया है, शायद एक कारण से --add-modulesया क्योंकि कुछ अन्य मॉड्यूल को इसकी आवश्यकता है। क्या आप एक नया प्रश्न खोल सकते हैं, इसलिए हम इस पर एक नज़र डाल सकते हैं?
निकोलई

1
यह सच है। दो विवरण: (1) यदि कोई स्पष्ट मॉड्यूल (यानी एक मॉड्यूल घोषणा के साथ) JAXB पर निर्भर करता है, तो आप अभी भी उन्हें वर्ग पथ पर रख सकते हैं, जहां विभाजित पैकेज कोई फर्क नहीं पड़ता। (2) कमांड लाइन विकल्प --patch-moduleविभाजन को मोड़ सकता है।
निकोलई

25

JDK9 के लिए JAXB (java.xml.bind)

Jdk9 / 10 EA पर मेरे डेस्कटॉप अनुप्रयोगों में पूरी तरह से काम करना

<properties>
    <jaxb-api.version>2.3.0</jaxb-api.version>
</properties>

<!-- JAXB 2.3.0 for jdk9+ -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>${jaxb-api.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>${jaxb-api.version}</version>
</dependency>
<!-- JAXB needs javax.activation module (jdk9) -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>javax.activation-api</artifactId>
    <version>1.2.0</version>
</dependency>

5
धन्यवाद, यह जावा से 10 पर मेरे लिए काम किया हालांकि, संस्करण संख्या के लिए केवल एक प्रॉपर्टी के उपयोग 2.3.0दोनों के लिए jaxb-apiऔर jaxb-runtimeएक अच्छा विचार नहीं है। Glassfish रनटाइम पर वर्तमान में है2.3.0.1 , जबकि एपीआई पर बनी हुई है 2.3.0। मैं propertiesपूरी तरह से उत्तर में तत्व छोड़ने का सुझाव देता हूं , और बस प्रत्येक संस्करण संख्या को प्रत्येक dependencyअलग से हार्ड-कोड करता हूं ।
बेसिल बोर्ख

मेरी सिफारिश: कुछ संस्करण <dependencyManagement>में org.glassfish.jaxb:jaxb-bomBOM आयात करें (नवीनतम अब 2.3.0.1 है), और फिर वास्तविक <dependencies>अनुभाग में, jaxb-apiया तो एक संस्करण निर्दिष्ट न करें jaxb-runtime। वर्जन नंबर बीओएम से पकड़ा जाएगा, जो सुनिश्चित करेगा कि वे हमेशा सिंक में हों और एक साथ अपग्रेड हो जाएं।
एंड्रयूएफ

2
JAXB 2.3। [0 | 1] अब जावा 11 के लिए काम नहीं करेगा! देखें github.com/eclipse-ee4j/jaxb-api/issues/78
col.panic

9

मुझे अपने स्प्रिंग बूट 2 आधारित एप्लिकेशन के लिए JAX-WS (java.xml.ws) और JAXB (java.xml.bind) को बदलने की आवश्यकता थी और इन JAR (ग्रैड बिल्ड) के साथ समाप्त हुआ:

// replacements for deprecated JDK module java.xml.ws
runtimeOnly 'javax.xml.ws:jaxws-api:2.3.0' // javax.xml.ws.* classes
runtimeOnly 'javax.jws:jsr181-api:1.0-MR1' // for javax.jws.* classes

// replacement for deprecated JDK module java.xml.bind
runtimeOnly 'javax.xml.bind:jaxb-api'
runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:2.3.0.1'
runtimeOnly 'org.glassfish:javax.json:1.1.2'
runtimeOnly 'org.eclipse:yasson:1.0.1'

(आप की जरूरत compileया अन्य गुंजाइश हो सकती है , runtimeOnlyहमारे लिए पर्याप्त था।)

मैंने देखा कि https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core को "पुराना" के रूप में वर्णित किया गया है और इस उत्तर का उपयोग करते हुए org.glassfishआधारित सामान के लिए चला गया जो कि इसमें भी लाया गया था org.eclipse.yasson

अब यह वास्तव में गड़बड़ स्थिति है, यह काम करता है, लेकिन किसी को यह कैसे सुनिश्चित करना चाहिए कि यह सबसे अच्छा प्रतिस्थापन है, है ना?


हम भी ढाल का उपयोग कर रहे हैं और मैं कहीं भी नहीं मिला। हल करने के लिए मावेन समाधान का अनुवाद करने की कोशिश की लेकिन कोई सफलता नहीं मिली। आपका उदाहरण मेरे लिए काम करता है (हालांकि संकलन का उपयोग किया जाता है, बशर्ते, प्रदान नहीं की गई परियोजना, जो मैं माइग्रेट करने की कोशिश करता हूं वर्टॉक्स का उपयोग कर रहा हूं)। साझा करने के लिए धन्यवाद और वास्तव में, मुझे यह भी उम्मीद है कि जल्द ही ग्रेडेल के बारे में कुछ स्पष्टीकरण होगा :)
लार्स

कृपया ध्यान दें कि स्थिति काफी तेजी से विकसित होती है - अभी हाल ही में मैंने एक अन्य परियोजना को स्प्रिंग बूट 2.2 में स्थानांतरित किया जहां जकार्ता एपीआई अधिक प्रमुख हैं, लेकिन हमें अभी भी कार्यान्वयन की आवश्यकता है। उसके लिए मैं अभी भी org.glassfish का उपयोग करता हूं। * सामान। जब भी मैं स्प्रिंग बूट परियोजना का उपयोग करता हूं, तो मैं उनके निर्भरता संस्करणों की जांच करता हूं और जितना संभव हो सके उसके अनुरूप होता है (वर्तमान में आपके लिए आवश्यक संस्करण में परिवर्तन): docs.spring.io/spring-boot/docs/current-reference/html/ …
वायरगो ४go

8

ऐसा लगता है कि jaxws-ri transjly से commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 पर निर्भर करता है जो जाहिरा तौर पर रिपॉजिटरी http://download.eclipse.org/rt.eclipselink/maven.repo से पाया जा सकता है।


1
शायद इसलिए क्योंकि यह एक जवाब के बजाय एक टिप्पणी के लिए अधिक अनुकूल था। बावजूद, क्या आप समस्या को ठीक करने में सक्षम थे? मैं निर्भरता को पुनः प्राप्त करने में सक्षम नहीं दिखाई देता। mvn -U clean installकहता रहता है Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852
Zyl

1
मैं विशेषज्ञ नहीं हूँ, लेकिन ऐसा लगता है कि यह सामान्य खोजा जा रहा है। sdo: commonj.sdo: jar: 2.1.1.v201112051852 जब pom.xml में कोई रिपॉजिटरी घोषित नहीं किया जाता है। अगर pom.xml (स्प्रिंग-स्नैपशॉट की तरह) में रिपॉजिटरी हैं, तो एक को download.eclipse.org/rt/eclipselink/maven.repository को भी जोड़ना होगा , उदाहरण के लिए <repository> <id> my-id </ id> <name> ग्रहण-रेपो </ name> <url> download.eclipse.org/rt/eclipselink/maven.repo </ url > </ repository> ps। मैं गए जवाब के बजाय टिप्पणी को शामिल किया है होता अगर मेरी प्रतिष्ठा बड़ा पर्याप्त था :)
theNikki1

2
मुझे यह काम करने के लिए मिल सकता था लेकिन मुझे अपनी सेटिंग से एक दर्पण भी निकालना पड़ा। xml। हालांकि आगे के निरीक्षण के बाद मैं यह नहीं बता सकता कि यह पदावनत पैकेज के लिए प्रतिस्थापन कैसे है। इसके बजाय मुझे यह निर्भरता मिली जो अच्छी तरह से काम करती है:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl

मैं सिर्फ पैकेज को बाहर करने में सक्षम थाsdo-eclipselink-plugin
यूसुफ वासना

2

उपरोक्त उत्तरों पर बस एक मामूली बदलाव (सुधार) --- केवल JAXB के लिए यहाँ उदाहरण दिया गया है। एक runtimeगुंजाइश के साथ निर्भरता को जोड़ सकते हैं और केवल अगर यह प्रभावी रूप से आवश्यक है (यानी जब संस्करण के साथ JRE में चलने के लिए निर्माण हो रहा है = = 9 --- यहाँ v11 का अनुकरण किया गया है):

<profile>
        <id>when-on-jdk-11</id>
        <activation>
            <jdk>11</jdk>
        </activation>

        <properties>
            <!-- missing artefacts version properties -->
            <jaxb-api.version>2.3.1</jaxb-api.version>
            <jaxb-impl.version>2.3.2</jaxb-impl.version> <!-- one might let it the same with the jaxb-api.version -->
        </properties>

        <dependencies>
            <!-- runtime dependencies to avoid JAXB related CNF exceptions when running on Java 11 (e.g.: ClassNotFoundException: javax.xml.bind.annotation.XmlType) -->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>${jaxb-api.version}</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>${jaxb-impl.version}</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>

1

मैंने JDK 11.0.3 का उपयोग करते हुए ऊपर वर्णित अधिकांश सुझावों के साथ प्रयोग किया है और सफल नहीं हुआ है। एकमात्र समाधान जो मुझे अंततः काम करने के लिए मिला, वह निम्नलिखित है। शायद अन्य विकल्प भी हैं जो काम भी करते हैं लेकिन ऐसा प्रतीत होता है कि संस्करण का चयन महत्वपूर्ण है। उदाहरण के लिए, com.sun.xml.ws:rt को 2.3.2 में बदलने से मॉड्यूल javax.jws लंबे समय तक उपलब्ध नहीं होगा।

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.4.0-b180830.0438</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>rt</artifactId>
        <version>2.3.1</version>
    </dependency> 

0

मुझे इन मुद्दों के JAXB भागों के चारों ओर जाने के लिए सबसे आसान रास्ता मिला, मेरे रूट पॉम या मेरे बम में निर्भरता प्रबंधन का उपयोग करना था:

    <project ...>
      <dependencyManagement>
        <dependencies>
          <!-- ... -->
          <!-- Gone from jvm in java11 -->
          <dependency>
          <groupId>com.sun.xml.bind</groupId>
          <artifactId>jaxb-ri</artifactId>
          <version>2.4.0-b180830.0438</version>
          <scope>import</scope>
          <type>pom</type>
        </dependency>
        <!-- ... -->
      </dependencies>
    </dependencyManagement>
    </project>

और मॉड्यूल में जो jdk11 पर संकलन विफल रहता है:

    <!-- ... -->
    <dependencies>
      <!-- Gone from jvm in java11 -->
      <dependency>
         <groupId>javax.xml.bind</groupId>
         <artifactId>jaxb-api</artifactId>
      </dependency>
      <dependency>
         <groupId>com.sun.xml.bind</groupId>
         <artifactId>jaxb-impl</artifactId>
         <scope>runtime</scope>
      </dependency>
      <dependency>
         <groupId>org.glassfish.jaxb</groupId>
         <artifactId>jaxb-runtime</artifactId>
         <scope>runtime</scope>
      </dependency>
      <!-- ... -->
    </dependencies>  
    <!-- ... -->

इसके अलावा, org.jvnet.jaxb2.maven2:maven-jaxb2-plugin0.14.0 के संस्करण को अपडेट करने से मेरे लिए सभी jaxb पीढ़ी के मुद्दों को हल किया गया।


0

मेरे स्प्रिंग mvc प्रोजेक्ट में jdk 11 + ant + ivy का उपयोग कर रहा हूँ। मुझे त्रुटि मिल रही थी " पैकेज javax.jws मौजूद नहीं है " इसलिए मैंने javax.jws-api-1.1.jar को क्लासपाथ में जोड़ा और यह काम कर गया! बस जार को https://repo1.maven.org/maven2/javax/jws/javax.jws-api/1.1/javax.jws-api-1.1.jar से डाउनलोड करें और इसे अपने buildp.xml में अपने classpath में जोड़ें।

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