Sostituzioni per moduli JPMS obsoleti con API Java EE


183

Java 9 ha deprecato sei moduli che contengono API Java EE e verranno presto rimossi :

  • java.activation con javax.activationpacchetto
  • java.corba con javax.activity, javax.rmi, javax.rmi.CORBAe org.omg.*pacchetti
  • java.transaction con javax.transactionpacchetto
  • java.xml.bind con tutti i javax.xml.bind.*pacchetti
  • java.xml.ws con javax.jws, javax.jws.soap, javax.xml.soape tutti javax.xml.ws.*i pacchetti
  • java.xml.ws.annotation con javax.annotationpacchetto

Quali artefatti di terze parti gestiti forniscono tali API? Non importa quanto bene forniscono queste API o quali altre funzionalità hanno da offrire - tutto ciò che conta è, sono un sostituto drop-in per questi moduli / pacchetti?

Per facilitare la raccolta di conoscenze, ho risposto con quello che so finora e ho reso la risposta un wiki della comunità. Spero che la gente lo estenda invece di scrivere le proprie risposte.


Prima di votare per chiudere:

  • Sì, ci sono già alcune domande sui singoli moduli e una risposta a questa domanda potrebbe ovviamente duplicare tali informazioni. Ma AFAIK non ha un singolo punto da imparare su tutti questi, che penso abbia molto valore.
  • Le domande che richiedono consigli sulle biblioteche sono generalmente considerate fuori tema, perché "tendono ad attirare risposte e spam presunti", ma non credo che si applichino qui. L'insieme di librerie valide è chiaramente delineato: devono implementare uno standard specifico. Oltre a ciò, nient'altro conta, quindi non vedo molti rischi per l'opinione e lo spam.

6
Puoi trovare principalmente quelli che vengono spostati su github.com/javaee e link a pochi dettagli su JEP 320: Rimuovi Java EE e moduli CORBA
Naman,

Vedi anche questo articolo 2018-05-14 in InfoWorld, tabella di marcia Java: l'impresa Java EE di Jakarta di Eclipse prende forma da Paul Krill. Sottotitoli: la Fondazione Eclipse delinea i 39 progetti che costituiranno il nuovo sforzo Java aziendale nativo del cloud e favorevole ai microservizi e come evolverà GlassFish
Basil Bourque,

2
Da JDK 11 è stato rimosso. Se stai usando jdk 9 o versioni successive, è meglio aggiungere direttamente la dipendenza piuttosto che usare il tipo di roba "--add-modules java.xml.bind"
Anver Sadhat,

Risposte:


205

Invece di utilizzare i moduli EE Java obsoleti, utilizzare i seguenti artefatti.

JAF ( java.activation )

JavaBeans Activation Framework (ora Jakarta Activation ) è una tecnologia autonoma (disponibile su Maven Central):

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

( Fonte )

CORBA ( java.corba )

Da JEP 320 :

Non ci sarà una versione autonoma di CORBA a meno che terze parti non subentrino alla manutenzione delle API CORBA, dell'implementazione di ORB, del provider CosNaming, ecc. La manutenzione di terze parti è possibile perché la piattaforma Java SE supporta implementazioni indipendenti di CORBA. Al contrario, l'API per RMI-IIOP è definita e implementata esclusivamente all'interno di Java SE. Non ci sarà una versione standalone di RMI-IIOP a meno che non venga avviata una JSR dedicata per mantenerla, o la gestione dell'API venga presa in carico dalla Eclipse Foundation (la transizione della gestione di Java EE dal JCP alla Eclipse Foundation include GlassFish e la sua implementazione di CORBA e RMI-IIOP).

JTA ( java.transaction )

Versione stand alone:

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

( Fonte )

JAXB ( java.xml.bind )

Da quando Java EE è stato rinominato in Jakarta EE , JAXB è ora fornito da nuovi manufatti:

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

Pagina di implementazione del riferimento JAXB .

schemagene xjcpuò essere scaricato anche lì come parte di una distribuzione JAXB autonoma.

Vedi anche la risposta collegata .

JAX-WS ( java.xml.ws )

Implementazione di riferimento:

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

Download di distribuzione autonomo (contiene wsgene wsimport).

Annotazioni comuni ( java.xml.ws.annotation )

Annotazioni Java Commons (disponibile su Maven Central):

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

( Fonte )


cosa fare se un modulo legge jax-wssia da jdk che da com.sun.xml.wsdipendenza?
nllsdfx,

1
Non sono sicuro di cosa esattamente stai chiedendo. Quale modulo legge jax-ws? Se hai java.xml.ws nel grafico del modulo e com.sun.xml.ws:jaxws-ri nel percorso della classe, quest'ultimo verrà ignorato (a causa dei pacchetti divisi ).
Nicolai,

Bene, voglio usare com.sun.xml.ws:jaxws-riinvece che java.xml.wsnel mio modulo perché quest'ultimo è deprecato e verrà rimosso. E ho aggiunto la dipendenza al mio file pom e appariva l'errore "il modulo xyz legge il pacchetto 'javax.xml.ws' sia da 'java.xml.ws' che da 'java.xml.ws'".
nllsdfx,

Sembra che il modulo java.xml.ws sia risolto dopo tutto, forse a causa di --add-moduleso perché alcuni altri moduli lo richiedono. Puoi aprire una nuova domanda, così possiamo darci un'occhiata?
Nicolai,

1
È vero. Due dettagli: (1) Se nessun modulo esplicito (cioè uno con una dichiarazione di modulo) dipende da JAXB, puoi comunque posizionarli sul percorso della classe, dove i pacchetti divisi non contano. (2) L'opzione della riga di comando --patch-modulepuò riparare la divisione.
Nicolai,

25

JAXB (java.xml.bind) per JDK9

Funziona perfettamente con le mie applicazioni desktop su 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
Grazie, questo ha funzionato per me su Java 10. Tuttavia, l'uso di una singola proprietà per il numero di versione 2.3.0per entrambi jaxb-apie jaxb-runtimenon è una buona idea. Il runtime di Glassfish è attualmente attivo2.3.0.1 mentre l'API rimane attiva 2.3.0. Suggerisco di eliminare completamente l' propertieselemento nella risposta e di codificare ogni numero di versione dependencyseparatamente.
Basil Bourque,

Il mio consiglio: in <dependencyManagement>, importare la org.glassfish.jaxb:jaxb-bomDBA in una versione (l'ultima ora è la 2.3.0.1), quindi nella <dependencies>sezione effettiva , non specificare una versione per jaxb-apio jaxb-runtime. Il numero di versione verrà acquisito dalla distinta componenti, il che garantirà che siano sempre sincronizzati e aggiornati insieme.
AndrewF,

2
JAXB 2.3. [0 | 1] non funzionerà più per Java 11! Vedi github.com/eclipse-ee4j/jaxb-api/issues/78
col.panic

9

Ho dovuto sostituire JAX-WS (java.xml.ws) e JAXB (java.xml.bind) per la mia applicazione basata su Spring Boot 2 e ho finito con questi JAR (build Gradle):

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

(Potrebbe essere necessario compileo altro scopo, è runtimeOnlystato sufficiente per noi.)

Ho notato che https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core è descritto come "Vecchio" e l'uso di questa risposta è andato per org.glassfishcose basate che hanno portato org.eclipse.yassonanche.

Ora è una situazione davvero disordinata, funziona, ma come si dovrebbe essere sicuri che sia il miglior sostituto, giusto?


stiamo anche usando il gradle e non sono arrivato da nessuna parte. Ho cercato di tradurre le soluzioni per il livellamento ma non c'è successo. Il tuo esempio funziona per me (usato compilando però, non fornito, il progetto che provo a migrare sta usando vertx). Grazie per la condivisione e anzi, spero anche che presto ci saranno alcuni chiarimenti in merito al voto :)
Lars

Si noti che la situazione si evolve abbastanza rapidamente: di recente ho spostato un altro progetto in Spring Boot 2.2 in cui le API di Jakarta sono più importanti, ma abbiamo anche bisogno di implementazioni. Per questo uso ancora org.glassfish. * Roba. Ogni volta che utilizzo il progetto Spring Boot, tendo a controllare l'appendice relativa alle versioni delle dipendenze e a conformarmi il più possibile a questa (cambiando la versione corrente a quella necessaria): docs.spring.io/spring-boot/docs/current/reference/html/ ...
virgo47,

8

Sembra che jaxws-ri dipenda in modo transitorio da commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 che apparentemente può essere trovato dal repository http://download.eclipse.org/rt/eclipselink/maven.repo


1
Probabilmente perché era più adatto a un commento piuttosto che a una risposta. Indipendentemente da ciò, sei stato in grado di risolvere il problema? Non sembra essere in grado di recuperare la dipendenza. mvn -U clean installcontinua a dire Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852.
Zyl,

1
Non sono esperto di maven, ma sembra che stia trovando commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 quando non sono dichiarati repository in pom.xml. Se ci sono repository in pom.xml (come l'istantanea di primavera) è necessario aggiungere anche download.eclipse.org/rt/eclipselink/maven.repository , ad esempio <repository> <id> my-id </id> <name> eclipse-repo </name> <url> download.eclipse.org/rt/eclipselink/maven.repo </ url > </repository> ps. Avrei aggiunto un commento invece di una risposta se la mia reputazione fosse abbastanza grande :)
theNikki1

2
Potrei farlo funzionare ma ho anche dovuto rimuovere un mirror dal mio settings.xml. Dopo un'ulteriore ispezione, tuttavia, non riesco a riprodurre come questo è un sostituto per il pacchetto obsoleto. Invece ho trovato questa dipendenza che funziona bene:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl

Sono stato in grado di escludere il pacchettosdo-eclipselink-plugin
Joseph Lust l'

2

Solo una piccola variazione (miglioramento) sulle risposte di cui sopra --- esemplificata qui solo per JAXB. Si possono aggiungere le dipendenze con l' runtimeambito e solo se ciò è effettivamente necessario (cioè quando si costruisce per l'esecuzione in un JRE con versione> = 9 --- qui v11 è esemplificato):

<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

Ho sperimentato la maggior parte dei suggerimenti sopra descritti usando JDK 11.0.3 e non ho avuto successo. L'unica soluzione che alla fine ho scoperto di funzionare è la seguente. Forse ci sono anche altre opzioni che funzionano, ma sembra che la selezione della versione sia fondamentale. Ad esempio, cambiando com.sun.xml.ws:rt in 2.3.2 si impedisce che il modulo javax.jws non sia più disponibile.

    <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

Ho trovato il percorso più semplice per aggirare le parti JAXB di questi problemi è stato quello di utilizzare la gestione delle dipendenze nel mio root pom o nel mio bom:

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

E nei moduli che falliscono la compilazione su 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>  
    <!-- ... -->

Inoltre, l'aggiornamento della versione org.jvnet.jaxb2.maven2:maven-jaxb2-plugin0.14.0 ha risolto tutti i problemi di generazione di jaxb per me.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.