Substituições para módulos JPMS descontinuados com APIs Java EE

183

O Java 9 reprovou seis módulos que contêm APIs Java EE e eles serão removidos em breve:

  • java.activation com javax.activationpacote
  • java.corba com javax.activity, javax.rmi, javax.rmi.CORBA, e org.omg.*pacotes
  • java.transaction com javax.transactionpacote
  • java.xml.bind com todos os javax.xml.bind.*pacotes
  • java.xml.ws com javax.jws, javax.jws.soap, javax.xml.soap, e todos os javax.xml.ws.*pacotes
  • java.xml.ws.annotation com javax.annotationpacote

Quais artefatos de terceiros mantidos fornecem essas APIs? Não importa o quão bem eles forneçam essas APIs ou quais outros recursos tenham - o que importa é que eles substituem esses módulos / pacotes?

Para facilitar a coleta de conhecimento, respondi com o que sei até agora e tornei a resposta um wiki da comunidade. Espero que as pessoas o estendam em vez de escrever suas próprias respostas.


Antes de votar para fechar:

  • Sim, já existem algumas perguntas em módulos individuais e uma resposta a essa pergunta duplicaria essas informações. Mas AFAIK não há um ponto único para aprender sobre tudo isso, o que acho que tem muito valor.
  • As perguntas que fazem recomendações de bibliotecas geralmente são consideradas fora de tópico, porque "tendem a atrair respostas opinativas e spam", mas acho que não se aplica aqui. O conjunto de bibliotecas válidas é claramente delineado: eles precisam implementar um padrão específico. Além disso, nada mais importa, então não vejo muito risco de opinião e spam.
Nicolai
fonte
6
Você pode encontrar principalmente todos aqueles que estão sendo movidos em github.com/javaee e links para alguns detalhes no JEP 320: Remover os módulos Java EE e CORBA
Naman
Consulte também este artigo de 2018-05-14 no roteiro InfoWorld, Java: o Java Enterprise do Eclipse Jakarta EE Java toma forma por Paul Krill. Legenda: A Fundação Eclipse descreve os 39 projetos que compõem o novo, a empresa esforço Java microservices-friendly cloud-natal, e como GlassFish vai evoluir
Basil Bourque
2
Do JDK 11, ele foi removido. Se você estiver usando o jdk 9 ou superior, é melhor adicionar a dependência diretamente, em vez de usar o tipo de coisa "--add-modules java.xml.bind"
Anver Sadhat 29/08/18

Respostas:

205

Em vez de usar os módulos Java EE descontinuados, use os seguintes artefatos.

JAF ( java.activation )

O JavaBeans Activation Framework (agora Jakarta Activation ) é uma tecnologia independente (disponível no Maven Central):

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

( Fonte )

CORBA ( java.corba )

Do JEP 320 :

Não haverá uma versão independente do CORBA, a menos que terceiros assumam a manutenção das APIs do CORBA, implementação do ORB, provedor CosNaming etc. A manutenção de terceiros é possível porque a Plataforma Java SE apoia as implementações independentes do CORBA. Por outro lado, a API para RMI-IIOP é definida e implementada apenas no Java SE. Não haverá uma versão independente do RMI-IIOP, a menos que um JSR dedicado seja iniciado para mantê-lo ou a administração da API seja assumida pela Eclipse Foundation (a transição da administração do Java EE do JCP para a Eclipse Foundation inclui o GlassFish e sua implementação do CORBA e do RMI-IIOP).

JTA ( java.transaction )

Versão autônoma:

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

( Fonte )

JAXB ( java.xml.bind )

Como o Java EE foi renomeado para Jakarta EE , o JAXB agora é fornecido por novos artefatos:

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

Página Implementação de Referência JAXB .

schemagene xjcpode ser baixado também como parte de uma distribuição JAXB independente.

Veja também a resposta vinculada .

JAX-WS ( java.xml.ws )

Implementação de referência:

<!-- 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 de distribuição independente (contém wsgene wsimport).

Anotações comuns ( java.xml.ws.annotation )

Anotações do Java Commons (disponível no Maven Central):

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

( Fonte )

Nicolai
fonte
o que fazer caso um módulo leia jax-wso jdk e a com.sun.xml.wsdependência?
Nllsdfx 16/05
1
Não tenho certeza do que exatamente você está perguntando. Qual módulo lê jax-ws? Se você tiver java.xml.ws no gráfico do módulo e com.sun.xml.ws:jaxws-ri no caminho da classe, o último será ignorado (por causa dos pacotes divididos ).
Nicolai
Bem, eu quero usar em com.sun.xml.ws:jaxws-rivez de java.xml.wsno meu módulo, porque este último está obsoleto e será removido. E adicionei a dependência ao meu arquivo pom e o erro "module xyz lê o pacote 'javax.xml.ws' de 'java.xml.ws' e 'java.xml.ws'" apareceu.
Nllsdfx 16/05
Parece que o módulo java.xml.ws foi resolvido, afinal, talvez devido a um --add-modulesou porque outros módulos o exijam. Você pode abrir uma nova pergunta para que possamos dar uma olhada?
Nicolai
1
Isso é verdade. Dois detalhes: (1) Se nenhum módulo explícito (isto é, um com uma declaração de módulo) depende do JAXB, você ainda pode colocá-los no caminho da classe, onde os pacotes divididos não importam. (2) A opção de linha de comando --patch-modulepode corrigir a divisão.
Nicolai
25

JAXB (java.xml.bind) para JDK9

Trabalhando perfeitamente em meus aplicativos de desktop no 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>
Bourgesl
fonte
5
Obrigado, isso funcionou para mim no Java 10. No entanto, o uso de uma única propriedade para o número da versão 2.3.0para ambos jaxb-apie jaxb-runtimenão é uma boa ideia. O tempo de execução do Glassfish está atualmente em2.3.0.1 enquanto a API permanece em 2.3.0. Sugiro que você solte o propertieselemento inteiramente na resposta e apenas codifique cada número de versão dependencyseparadamente.
Basil Bourque
Minha recomendação: in <dependencyManagement>, importe a org.glassfish.jaxb:jaxb-bomBOM em alguma versão (a mais recente agora é 2.3.0.1) e, na <dependencies>seção real , não especifique uma versão para jaxb-apiou jaxb-runtime. O número da versão será obtido na BOM, o que garantirá que eles estejam sempre sincronizados e sejam atualizados juntos.
AndrewF
2
O JAXB 2.3. [0 | 1] não funcionará mais no Java 11! Veja github.com/eclipse-ee4j/jaxb-api/issues/78
col.panic
9

Eu precisava substituir JAX-WS (java.xml.ws) e JAXB (java.xml.bind) pelo meu aplicativo baseado no Spring Boot 2 e terminei com esses JARs (versão 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'

(Você pode precisar compileou outro escopo, runtimeOnlyfoi o suficiente para nós.)

Notei que https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core é descrito como "Old" e usando esta resposta foi para org.glassfisho material base que trouxe org.eclipse.yassontambém.

Agora é uma situação realmente confusa, funciona, mas como alguém deve ter certeza de que é a melhor substituição, certo?

virgo47
fonte
também estamos usando gradle e não cheguei a lugar nenhum. Tentei traduzir as soluções maven para gradle, mas sem sucesso. Seu exemplo funciona para mim (porém, compilação usada, não fornecida, o projeto que tento migrar está usando o vertx). Obrigado por compartilhar e, na verdade, eu também espero que haverá alguns esclarecimentos a respeito em breve Gradle :)
Lars
Observe que a situação evolui rapidamente - recentemente mudei outro projeto para o Spring Boot 2.2, onde as APIs de Jacarta são mais importantes, mas ainda precisamos de implementações. Para isso eu ainda uso org.glassfish. * Stuff. Sempre que uso o projeto Spring Boot, costumo verificar o apêndice das versões das dependências e estar em conformidade com isso o máximo possível (altere a atual para a versão que você precisa): docs.spring.io/spring-boot/docs/current/reference/html/ …
virgo47
8

Parece que o jaxws-ri depende transitivamente de commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 que aparentemente pode ser encontrado no repositório http://download.eclipse.org/rt/eclipselink/maven.repo

theNikki1
fonte
1
Provavelmente porque foi mais adequado para um comentário do que para uma resposta. Independentemente disso, você conseguiu resolver o problema? Parece que não consigo recuperar a dependência. mvn -U clean installcontinua dizendo Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852.
Zyl
1
Eu não sou um especialista experiente, mas parece que ele está encontrando commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 quando nenhum repositório é declarado no pom.xml. Se houver repositórios no pom.xml (como spring-snapshot), é necessário adicionar download.eclipse.org/rt/eclipselink/maven.repository , por exemplo, <repository> <id> my-id </id> <name> eclipse-repo </name> <url> download.eclipse.org/rt/eclipselink/maven.repo </ url > </repository> ps. Eu teria acrescentado comentário em vez de resposta se a minha reputação era grande o suficiente :)
theNikki1
2
Eu consegui fazê-lo funcionar, mas também precisei remover um espelho do meu settings.xml. Após uma inspeção mais aprofundada, no entanto, não consigo reproduzir como isso substitui o pacote obsoleto. Em vez disso eu achei essa dependência que funciona muito bem:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl
Eu era capaz de excluir apenas o pacotesdo-eclipselink-plugin
Joseph Lust
2

Apenas uma pequena variação (melhoria) nas respostas acima --- exemplificada aqui apenas para JAXB. É possível adicionar as dependências com o runtimeescopo e somente se isso for efetivamente necessário (ou seja, ao criar para execução em um JRE com a versão> = 9 --- aqui a v11 é exemplificada):

<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>
paul-emil
fonte
1

Eu experimentei a maioria das sugestões descritas acima usando o JDK 11.0.3 e não obtive sucesso. A única solução que acabei encontrando para trabalhar é a seguinte. Talvez haja outras opções que também funcionem, mas parece que a seleção da versão é crítica. Por exemplo, alterar com.sun.xml.ws:rt para 2.3.2 faz com que o módulo javax.jws não esteja mais disponível.

    <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> 
Des Albert
fonte
0

Eu encontrei o caminho mais fácil para contornar as partes JAXB desses problemas foi usar o gerenciamento de dependência no meu pom raiz ou no meu 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 nos módulos que falham na compilação no 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>  
    <!-- ... -->

Além disso, a atualização da versão org.jvnet.jaxb2.maven2:maven-jaxb2-pluginpara 0.14.0 resolveu todos os problemas de geração do jaxb para mim.

George
fonte