Replacements for deprecated JPMS modules with Java EE APIs
Solution 1
Instead of using the deprecated Java EE modules, use the following artifacts.
JAF (java.activation)
JavaBeans Activation Framework (now Jakarta Activation) is a standalone technology (available on Maven Central):
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>jakarta.activation</artifactId>
<version>1.2.2</version>
</dependency>
(Source)
CORBA (java.corba)
From JEP 320:
There will not be a standalone version of CORBA unless third parties take over maintenance of the CORBA APIs, ORB implementation, CosNaming provider, etc. Third party maintenance is possible because the Java SE Platform endorses independent implementations of CORBA. In contrast, the API for RMI-IIOP is defined and implemented solely within Java SE. There will not be a standalone version of RMI-IIOP unless a dedicated JSR is started to maintain it, or stewardship of the API is taken over by the Eclipse Foundation (the transition of stewardship of Java EE from the JCP to the Eclipse Foundation includes GlassFish and its implementation of CORBA and RMI-IIOP).
JTA (java.transaction)
Stand alone version:
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
<version>1.3.3</version>
</dependency>
(Source)
JAXB (java.xml.bind)
Since Java EE was rebranded to Jakarta EE, JAXB is now provided by new artifacts:
<!-- 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>
<!-- Alternative runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
<scope>runtime</scope>
</dependency>
JAXB Reference Implementation page.
The alternative runtime was brought up by Abhijit Sarkar.
schemagen
and xjc
can be downloaded from there too as part of a standalone JAXB distribution.
See also linked answer.
JAX-WS (java.xml.ws)
Reference implementation:
<!-- 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>
Standalone distribution download (contains wsgen
and wsimport
).
Common Annotations (java.xml.ws.annotation)
Java Commons Annotations (available on Maven Central):
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
</dependency>
(Source)
Solution 2
JAXB (java.xml.bind) for JDK9
Working perfectly in my desktop applications on 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>
Solution 3
I needed to replace JAX-WS (java.xml.ws) and JAXB (java.xml.bind) for my Spring Boot 2 based application and ended up with these JARs (Gradle build):
// 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'
(You may need compile
or other scope, runtimeOnly
was enough for us.)
I noticed that https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core is described as "Old" and using this answer went for org.glassfish
based stuff that brought in org.eclipse.yasson
as well.
Now it's really messy situation, it works, but how should anyone be sure it's the best replacement, right?
Solution 4
It seems that jaxws-ri depends transitively from commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852 which apparently can be found from repository http://download.eclipse.org/rt/eclipselink/maven.repo
Solution 5
I'm using jdk 11 + ant + ivy in my spring mvc project.
I was getting error "package javax.jws does not exist" so I added javax.jws-api-1.1.jar to classpath and it worked!
Just download the jar from https://repo1.maven.org/maven2/javax/jws/javax.jws-api/1.1/javax.jws-api-1.1.jar
And add it to your classpath in your build.xml
Alternatively add it to your pom.xml
:
<dependency>
<groupId>javax.jws</groupId>
<artifactId>javax.jws-api</artifactId>
<version>1.1</version>
</dependency>
Related videos on Youtube
Nicolai Parlog
Nicolai (aka nipafx) is a Java enthusiast focused on language features and core APIs with a passion for learning and sharing. He does that in blog posts, articles, newsletters, and books; in tweets, repos, videos, and streams; at conferences and in-house trainings - more on all of that on nipafx.dev. That aside, he's best known for his haircut.
Updated on April 17, 2022Comments
-
Nicolai Parlog about 2 years
Java 9 deprecated six modules that contain Java EE APIs and they are going to be removed soon:
-
java.activation with
javax.activation
package -
java.corba with
javax.activity
,javax.rmi
,javax.rmi.CORBA
, andorg.omg.*
packages -
java.transaction with
javax.transaction
package -
java.xml.bind with all
javax.xml.bind.*
packages -
java.xml.ws with
javax.jws
,javax.jws.soap
,javax.xml.soap
, and alljavax.xml.ws.*
packages -
java.xml.ws.annotation with
javax.annotation
package
Which maintained third-party artifacts provide those APIs? It doesn't matter how well they provide those APIs or which other features they have to offer - all that matters is, are they a drop-in replacement for these modules/packages?
To make it easier to collect knoweldge, I answered with what I know so far and made the answer a community wiki. I hope people will extend it instead of writing their own answers.
Before you vote to close:
- Yes, there are already some questions on individual modules and an answer to this question would of course duplicate that information. But AFAIK there is no single point to learn about all of these, which I think has a lot of value.
- Questions asking for library recommendations are usually considered off-topic, because "they tend to attract opinionated answers and spam", but I don't think that applies here. The set of valid libraries is clearly delineated: They have to implement a specific standard. Beyond that nothing else matters, so I don't see much risk for opinion and spam.
-
Naman over 6 yearsYou can mostly find all of those getting moved under github.com/javaee and links to few specifics at JEP 320: Remove the Java EE and CORBA Modules
-
Basil Bourque almost 6 yearsSee also this 2018-05-14 article in InfoWorld, Java roadmap: Eclipse’s Jakarta EE enterprise Java takes shape by Paul Krill. Subtitle: The Eclipse Foundation outlines the 39 projects that will make up the new cloud-native, microservices-friendly enterprise Java effort, and how GlassFish will evolve
-
Anver Sadhat over 5 yearsFrom JDK 11 it has been removed. If you are using jdk 9 or above it is better to add the dependency directly rather then using the "--add-modules java.xml.bind" kind of stuff
-
java.activation with
-
nllsdfx almost 6 yearswhat to do in case if a module reads
jax-ws
from both jdk andcom.sun.xml.ws
dependency? -
Nicolai Parlog almost 6 yearsI'm not sure what exactly you're asking. Which module reads jax-ws? If you have java.xml.ws in the module graph and com.sun.xml.ws:jaxws-ri on the class path, the latter will be ignored (because of split packages).
-
nllsdfx almost 6 yearsWell I want to use
com.sun.xml.ws:jaxws-ri
instead ofjava.xml.ws
in my module because the latter is deprecated and will be removed. And I added the dependency to my pom file and the error "module xyz reads package 'javax.xml.ws' from both 'java.xml.ws' and 'java.xml.ws'" appeared. -
Nicolai Parlog almost 6 yearsIt looks like the module java.xml.ws is resolved after all, maybe due to an
--add-modules
or because some other modules requires it. Can you open a new question, so we can take a look at it? -
nllsdfx almost 6 yearshave a look please at stackoverflow.com/questions/50392459/…
-
ZhekaKozlov almost 6 yearsWhat about the java.se.ee module itself? Is there a replacement for that in maven?
-
Nicolai Parlog almost 6 years@ZhekaKozlov Not as far as I know, but would be easy to create oneif you need it.
-
Zyl almost 6 yearsProbably because it was more suited for a comment rather than an answer. Regardless, were you able to fix the problem? I don't appear to be able to retrieve the dependency.
mvn -U clean install
keeps sayingCould not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852
. -
theNikki1 almost 6 yearsI'm not maven expert, but it seems that it is finding commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852 when no repositories are declared in pom.xml. If there are repositories in pom.xml (like spring-snapshot) one must also add download.eclipse.org/rt/eclipselink/maven.repository, for example <repository> <id>my-id</id> <name>eclipse-repo</name> <url>download.eclipse.org/rt/eclipselink/maven.repo</url> </repository> ps. I've would have added comment instead of answer if my reputation was big enough :)
-
Zyl almost 6 yearsI could get it to work but I had to also remove a mirror from my settings.xml. After further inspection however I cannot reproduce how this is a replacement for the deprecated package. Instead I found this dependency which works nicely:
<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
-
Basil Bourque almost 6 yearsThanks, this worked for me on Java 10. However, that use of a single property for version number
2.3.0
for bothjaxb-api
andjaxb-runtime
is not a good idea. The Glassfish runtime is currently at2.3.0.1
while the API remains at2.3.0
. I suggest dropping theproperties
element entirely in the Answer, and just hard-code each version number in eachdependency
separately. -
Lars over 5 yearswe're also using gradle and I didn't get anywhere. Tried to translate the maven solutions to gradle but no success. Your example works for me (used compile though, not provided, the project I try to migrate is using vertx). Thanks for sharing and indeed, i also hope there will be some clarifications regarding gradle soon :)
-
Terran over 5 yearsConcerning the JAXB replacements. Both jaxb-core and jaxb-impl contain the same package name "com.sun.xml.bind" and will cause "split package" error in a JPMS modular application. It will not work if both are present.
-
Nicolai Parlog over 5 yearsThat's true. Two details: (1) If no explicit module (i.e. one with a module declaration) depends on JAXB, you can still place them on the class path, where split packages don't matter. (2) The command line option
--patch-module
can mend the split. -
AndrewF over 5 yearsMy recommendation: in
<dependencyManagement>
, import theorg.glassfish.jaxb:jaxb-bom
BOM at some version (latest now is 2.3.0.1), and then in the actual<dependencies>
section, do not specify a version for eitherjaxb-api
orjaxb-runtime
. The version number will be grabbed from the BOM, which will ensure they are always in sync and get upgraded together. -
Joseph Lust over 5 yearsI was able to just exclude the package
sdo-eclipselink-plugin
-
col.panic over 5 yearsJAXB 2.3.[0|1] will not work for Java 11 anymore! See github.com/eclipse-ee4j/jaxb-api/issues/78
-
ZhekaKozlov over 4 years@Terran The split package problem is no more actual. There is now a single Maven module
jaxb-runtime
instead of two modulesjaxb-core
andjaxb-impl
. -
Zain Qazi about 4 yearsNeed this as well com.google.code.findbugs:jsr305 in case we have missing
javax.annotation.Nullable
-
virgo47 almost 4 yearsPlease, note that situation evolves quite quickly - just recently I moved another project to Spring Boot 2.2 where Jakarta APIs are more prominent, but we also still need implementations. For that I still use org.glassfish.* stuff. Whenever I use Spring Boot project, I tend to check their dependency versions appendix and conform to that as much as possible (change current to version you need): docs.spring.io/spring-boot/docs/current/reference/html/…
-
msteiger almost 4 yearsYou can include it properly through Maven's dependency resolution system:
<dependency> <groupId>javax.jws</groupId> <artifactId>javax.jws-api</artifactId><version>1.1</version> </dependency>
and it actually resolves the "javax.jws" classes correctly. -
xenoterracide over 3 yearsthis appears to be the most update to date answer... so I'd like to add an additional question, is there a right way with maven to add these jars, but only if it's on java 11+ meaning that building/running (in dev) on java 8 would still be functional without having to be concerned for which class/jar is actually being used. Obviously if you have a build artifact you'd have to filter or not depending on what you're building for, but just running in dev mode would be different.
-
Abhijit Sarkar about 3 years
-
Nicolai Parlog about 3 yearsThanks @AbhijitSarkar, I added it to the answer.
-
Reto Höhener almost 3 yearsWhat will the future JAXB maven coordinates be? I'm confused because the Jakarta page says
com.sun.xml.bind:jaxb-impl
, but @AbhijitSarkar says it's deprecated?