在Jetty中使用web.xml和WebAppContext

时间:2018-04-02 11:21:53

标签: servlets jetty web.xml

这是我的第一个网络应用程序,我只是尝试按照JsonConverter指定的 servlets 来关注指南并启动我的服务器,但似乎我的行为不会改变服务器的功能和结果是 404 错误。但是如果我以编程方式指定servlet就行了。任何人都可以弄清楚这一切应该如何运作? 这是我的服务器代码

web.xml

我的web.xml看起来像这样

public class Launcher
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);
        WebAppContext web = new WebAppContext();
        web.setContextPath("/");
        web.setWar("src/main/web/WEB-INF/web.xml");
        //web.addServlet(MyServlet.class,"/"); This line works just fine
        server.setHandler(web);
        server.start();
        server.join();
    }
}

1 个答案:

答案 0 :(得分:1)

WEB-INF/web.xml是描述符。

WebAppContext.setWar(String)的调用是针对基本资源位置的。

  

注意:基本资源位置是必需的。您必须将其设置为有效位置,以便ServletContext可以正常运行。

     

还有其他API可用于设置基本资源位置:您也可以使用WebAppContext.setBaseResource(Resource)WebAppContext.setResourceBase(String),它们的含义相同。

如果要使用WebAppContext.setDescriptor(String)指定Web描述符位置。

对于您的代码示例,您似乎想要使用

    Server server = new Server(8080);
    WebAppContext web = new WebAppContext();
    web.setContextPath("/");
    web.setWar("src/main/web"); // TODO: resolve this to a an absolute path or URI!
    server.setHandler(web);
    server.start();
    server.join();

关于该TODO,请参阅jetty-project/embedded-jetty-cookbook上的示例,具体而言......

重要的是要认识到默认情况下,类路径将基于基本资源位置。

将从${base.resource.uri}/classes查找课程。

我指出了这一点,因为我们在您的示例中看到路径src/main/web,我怀疑您正在尝试在IDE工作中创建一个实时(未构建)项目。这种设置需要更多的手动工作,因为基础资源和类位于不同的位置。

在这种情况下,您需要手动指定类的位置。

又名。

    Server server = new Server(8080);
    WebAppContext web = new WebAppContext();
    web.setContextPath("/");

    Path baseResource = new File("src/main/web").toPath();
    Path classesDir = new File("target/thewebapp/WEB-INF/classes").toPath();

    if (!Files.exists(baseResource))
        throw new FileNotFoundException("Unable to find Base Resource Dir: " + baseResource);
    if (!Files.exists(classesDir))
        throw new FileNotFoundException("Unable to find Classes Dir: " + classesDir);

    web.setBaseResource(new PathResource(baseResource.toAbsolutePath()));
    web.setExtraClasspath(classesDir.toAbsolutePath().toString());
    server.setHandler(web);
    server.start();
    server.join();

最后,我想指出一些其他方法可以在嵌入式Jetty中打包webapp ...

嵌入式码头-尤伯杯罐

https://github.com/jetty-project/embedded-jetty-uber-jar

这使用ServletContextHandler手动构建一个webapp,不使用WEB-INF/web.xml,没有字节码扫描,没有注释扫描,启动速度极快。

上面的项目构建了一个jar,其中包含运行webapp所需的一切。

嵌入式码头活战

https://github.com/jetty-project/embedded-jetty-live-war

这个项目有点复杂,它构建了3个部分(webapp,server,bootstrap),然后将它们组合成一个war文件。

这从一场简单的战争开始,然后通过预先配置您想要的服务器来增强它。这个新的“现场战争”在一个单独的子项目中被组装成一个新的战争档案。

此war文件可以正常部署,它可以作为独立的自执行war文件直接运行,并配有完整的服务器实例。