这是我的第一个网络应用程序,我只是尝试按照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();
}
}
答案 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文件直接运行,并配有完整的服务器实例。