November 19, 2012
Getting Started Playing Around with JAX-RS 2.0 in an EE Container
Trying out the latest JAX-RS API advancements in an EE container is a bit of a pain because pulling in the latest JAX-RS 2.0 libraries into a Java EE environment creates conflicts with the EE-shipped JAX-RS version. Ah yes, and of course you want your IDE to pick up the correct libs for code completion.
After trying and tweaking a bit the most workable solution for me was to download the latest Glassfish 4 build. It uses a Jersey version that is usually only a couple of days behind the JAX-RS API Snapshot.
Here is what I do:
This will unzip to a glassfish3/ directory, so to start the server do
To find the JAX-RS version included in the Glassfish you just downloaded do something like the following:
jar -xf glassfish3/glassfish/modules/javax.ws.rs-api.jar META-INF/MANIFEST.MF; grep Bundle-Version META-INF/MANIFEST.MF
(This will leave a META-INF directory behind you might want to clean up afterwards)
For the b63 version this yields:
The next step is to create a project to test things out. I am using the following archetype, but any other EE Web profile archetype should work similarly:
mvn archetype:generate \ -DarchetypeGroupId=org.codehaus.mojo.archetypes \ -DarchetypeArtifactId=webapp-javaee6 \ -DgroupId=org.example \ -DartifactId=test \ -DinteractiveMode=false
Now let’s edit the POM to pull in the JAX-RS 2.0-Version used by the Glassfish. First, add the proper repository.
<repository> <id>snapshot-repository.java.net</id> <name>Java.net Snapshot Repository for Maven</name> <url>https://maven.java.net/content/repositories/snapshots/</url> <layout>default</layout> </repository>
Then add the dependency to the specific release (note that the version is not literally the same as the bundle version you extracted above):
<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0-m12</version> <scope>provided</scope> </dependency>
UPDATE: It seems you have to make sure you include this dependency before the dependency to the Java EE Web API. Otherwise, maven insists on trying to use the JAX-RS API version of the Java EE Web API.
You should now be able to
mvn package and deploy to the Glassfish instance any 2.0-m12 based source code.
The final step will be to cd into your project folder and set up your IDE project. E.g. with Eclipse run
and import as existing Maven project into Eclipse.
Code completion should now suggest you the 2.0-m12 API.
If you want to have code completion work with the SNAPSHOT, simply change the POM dependency and rerun
mvn eclipse:eclipse. This will likely break when deployed in the container (if you use a SNAPSHOT-only API feature) but still it is nice to play around with the very latest API changes.
This focusses on JAX-RS 2.0 latest features. Keep in mind that for the rest of Java EE we referenced the EE6 Web API profile. This is not for testing latest EE7 features in general.
UPDATE: You can find the releases, including the apidoc jars here.