JAX-RS (using Apache CXF) in embedded Tomcat example
January 13, 2015 [Java, rest, Tech]I had serious trouble today firing up an embedded Tomcat server that serves up REST resources using JAX-RS via Apache CXF.
Here's minimal example, hopefully saving you the same trouble:
src/HelloJaxRs.java:
import org.apache.catalina.startup.Tomcat; import org.apache.catalina.Context; import org.apache.catalina.Wrapper; public class HelloJaxRs { public static void main( String[] args ) throws Exception { Tomcat tomcat = new Tomcat(); Context context = tomcat.addContext( "/", "" ); Wrapper servlet = context.createWrapper(); servlet.setName( "jaxrs" ); servlet.setServletClass( "org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet" ); servlet.addInitParameter( "jaxrs.serviceClasses", Hello.class.getName() ); servlet.setLoadOnStartup( 1 ); context.addChild( servlet ); context.addServletMapping( "/rest/*", "jaxrs" ); tomcat.start(); tomcat.getServer().await(); } }
src/Hello.java:
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @Path( "/hello/{name}" ) public class Hello { @GET public String getThing( @PathParam( "name" ) String name ) { return "Hello, " + name; } }
build.xml:
<?xml version="1.0" encoding="UTF-8"?> <project default="run"><target name="run" depends="compile"> <mkdir dir="bin/tomcat.8080/webapps"/> <java classname="HelloJaxRs" fork="true" failonerror="true" dir="bin" > <classpath> <pathelement location="bin/"/> <fileset dir="lib"><include name="**/*.jar"/></fileset> </classpath> </java> </target> <target name="compile"> <mkdir dir="bin"/> <javac srcdir="src" destdir="bin"> <classpath> <fileset dir="lib"><include name="**/*.jar"/></fileset> </classpath> <compilerarg value="-Werror"/> </javac> </target>
</project>
To download the dependencies (or you can do something clever with Maven):
$ mkdir lib $ cd lib $ wget http://www.webhostingjams.com/mirror/apache/tomcat/tomcat-7/v7.0.57/bin/apache-tomcat-7.0.57.tar.gz $ tar -xzf apache-tomcat-7.0.57.tar.gz $ wget http://www.apache.org/dyn/closer.cgi?path=/cxf/3.0.3/apache-cxf-3.0.3.tar.gz $ tar -xzf apache-cxf-3.0.3.tar.gz $ cd ..
To run Tomcat:
$ ant
Then, in another terminal, you can see it's working:
$ curl http://localhost:8080/rest/hello/andy Hello, andy