需求是比较简便的发布,不需要配置文件。于是就像到了Embedded Tomcat。代码如下:
public class TomcatLauncher {
public static void main(String[] args) throws Exception {
Path path = Files.createTempDirectory("webapps");
Tomcat tomcat = new Tomcat();
// 添加一个webapp,路径是/t
Context ctx = tomcat.addWebapp("/t", new File(".").getAbsolutePath());
//Resteasy的Listener
ctx.addApplicationListener("org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap");
//各个Resource的配置类
ctx.addParameter("javax.ws.rs.core.Application", "com.rum.restful.Config");
//路径配置,一般和下面的Servlet Mapping那里的一致
ctx.addParameter("resteasy.servlet.mapping.prefix", "/services");
//在webapp /t下面添加名字为Resteasy的Servlet
tomcat.addServlet("/t", "Resteasy", new HttpServletDispatcher());
//将所有/services下面的请求交给ResteasyServlet处理
ctx.addServletMapping("/services/*", "Resteasy");
// Tomcat Native / APR . 需要tc-native1.dll
// 不是必须
StandardServer server = (StandardServer)tomcat.getServer();
AprLifecycleListener listener = new AprLifecycleListener();
server.addLifecycleListener(listener);
tomcat.setPort(8080); // 端口
tomcat.start();
tomcat.getServer().await();
}
}
其中com.rum.restful.Config是Resteasy的Application配置类:
public class Config extends Application {
HashSet<Object> singletons = new HashSet<Object>();
public Config() {
singletons.add(new HelloResource());
}
@Override
public Set<Class<?>> getClasses()
{
HashSet<Class<?>> set = new HashSet<Class<?>>();
return set;
}
@Override
public Set<Object> getSingletons()
{
return singletons;
}
}
HelloResource是一个Restful Resource:
@Path("trace")
public class HelloResource {
@GET
@Produces("text/plain")
public String toString(@QueryParam("id") String id) {
return Thread.currentThread().getName() + "hello, world " + id;
}
}
然后就可以通过http://SERVER:8080/t/services/trace来访问这个Resource了。
什么web.xml 都不需要了,呵呵