在Tomcat + Jersey中没有web.xml的容器启动时加载webapp?

时间:2013-10-19 15:36:10

标签: java tomcat servlets jersey jax-rs

我目前有没有web.xml的Jersey webapp。它部署得很好,但在收到第一个Web请求之前不会启动。

要在启动时加载webapp,我可以为webapp创建一个web.xml并提供a load-on-startup tag。但是,我强烈不想制作web.xml。

有没有办法在没有web.xml的情况下启动JAX-RS应用程序?我甚至会接受特定于Jersey和/或Tomcat的解决方案。

编辑:我也会接受一个解决方案,急切地在Tomcat实例中加载所有应用程序。

编辑:让我根据评论提供有关如何部署应用的更多信息。

部署过程并不复杂。

该应用程序将运行在运行Ubuntu 12.04的EC2实例上。我正在手动设置一个App实例;一旦它工作,我将制作应用程序的AMI并根据需要创建它的其他副本。

要在初始实例上部署应用程序,我只是将WAR文件复制到/var/lib/tomcat7/webapps并重新启动Tomcat。此Tomcat实例上不会运行任何其他Web应用程序。

如果有任何其他信息有用,请告诉我们!我很乐意添加它。

编辑:为了清楚起见,这就是我的webapp Application课程的高级视图:

@ApplicationPath("/")
public class App extends ResourceConfig {
    // ...
}

我正在使用Jersey特定的ResourceConfig类而不是更一般的JAX-RS Application类,因为我使用Jersey的内置HK-2进行一些依赖注入。 / p>

2 个答案:

答案 0 :(得分:1)

我能想到的唯一方法就是切换到自己设置泽西ServletContainerset its "load on startup" value设置大于零的东西。你可以使用ServletContainerInitializer(没有关系 - 命名只是巧合)来做到这一点。如果你碰巧使用Spring,它的WebApplicationInitializer提供相同的机制,接口稍微方便一些。

另一种相当hacky的方法是编写一个扩展ServletContainer的类并给它an appropriate Servlet 3.0 annotation,类似于@WebServlet(value="/", loadOnStartup=1)

答案 1 :(得分:1)

一种解决方案是通过向您的部署脚本添加对curlwget的调用来强制向应用发送第一个请求。它具有加热任何缓存的额外优势。如果部署和应用程序确实有效,它可用于测试。 (只需检查HTTP状态代码或响应页面上的一些文字......)