gpt4 book ai didi

java - 从 Java Web 项目构建 WAR 和自可执行 JAR

转载 作者:行者123 更新时间:2023-11-30 01:44:03 25 4
gpt4 key购买 nike

我有一个 Java servlet 项目,我想构建一个 WAR 来部署到服务器,以及一个带有可以独立运行的嵌入式 Jetty 服务器的可执行 JAR。该项目如下所示:

HelloWorldServlets
common
src/main
java
HelloServlet.java
webapp
index.jsp
build.gradle
jetty
src/main
java
JettyServer.java
build.gradle
build.gradle

jetty 导入 common 作为编译依赖项。构建任务是:

jar {
manifest { attributes "Main-Class": "JettyServer" }
from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) })
}
common中的

jar任务如下:

jar {
sourceSets.main.resources.srcDirs += ["src/main/webapp"]
}

Web 资源包含在 common.jar 中,并且 common.jar 被扁平化在 jetty.jar 中,因此 jetty.jar 在其根目录中拥有资源,但是将服务器设置为:

Server server = new Server(8080);
WebAppContext context = new WebAppContext();
server.setHandler(context);

context.setResourceBase("/");
context.setContextPath("/");
context.addServlet(Hello.class, "");

总是导致HTTP ERROR 404 Problem accessing/index.jsp.

我是否应该将 common.jar 平铺到 jetty.jar 中,或者我缺少有关 ResourceBase 的某些内容?谢谢!

最佳答案

代码示例中需要注意的一些事项。

  • 由于您希望使用 JSP,因此您必须满足 JSP 的最低要求。
  • setResourceBase(String) 必须是绝对路径和/或 URI 引用(无相对路径)(JSP 要求)
  • 必须正确定义 DefaultServlet。 (JSP 要求)
  • 添加 Servlet(或过滤器)时,必须使用有效的 url 模式。 (Servlet 要求)
  • DefaultHandler 添加到处理程序树的最后,因为当您遇到上下文和/或处理程序错误需要进行故障排除时,它会有所帮助。

出现问题的最常见原因是使用 WebAppContext 会导致强制执行标准 Servlet 类加载器隔离,并且很可能会导致出现问题。

要么破坏类加载器...

Server server = new Server(8080);

// Figure out what path to serve content from
ClassLoader cl = DemoProject.class.getClassLoader();
// We look for a file, as ClassLoader.getResource() is not
// designed to look for directories (we resolve the directory later)
URL f = cl.getResource("jsp-root/index.jsp");
if (f == null)
{
throw new RuntimeException("Unable to find resource directory");
}

// Resolve file to directory
URI webRootUri = f.toURI().resolve("./").normalize();
System.err.println("WebRoot is " + webRootUri);

WebAppContext context = new WebAppContext();
context.setBaseResource(Resource.newResource(webRootUri));
context.setContextPath("/");
context.addServlet(Hello.class, "/hello");
context.setParentLoaderPriority(true); // use server classloader first

HandlerList handlers = new HandlerList();
handlers.addHandler(context);
handlers.addHandler(new DefaultHandler()); // for errors when request doesn't match above handlers
server.setHandler(handlers);

...或者只是不使用 WebAppContext ...

Server server = new Server(8080);

// Figure out what path to serve content from
ClassLoader cl = DemoProject.class.getClassLoader();
// We look for a file, as ClassLoader.getResource() is not
// designed to look for directories (we resolve the directory later)
URL f = cl.getResource("jsp-root/index.jsp");
if (f == null)
{
throw new RuntimeException("Unable to find resource directory");
}

// Resolve file to directory
URI webRootUri = f.toURI().resolve("./").normalize();
System.err.println("WebRoot is " + webRootUri);

ServletContextHandler context = new ServletContextHandler();
context.setBaseResource(Resource.newResource(webRootUri));
context.setContextPath("/");
context.addServlet(Hello.class, "/hello");

// Must be added last, must be named "default" (JSP and Servlet requirement)
ServletHolder holderDef = new ServletHolder("default", DefaultServlet.class);
holderDef.setInitParameter("dirAllowed","false");
context.addServlet(holderDef,"/"); // Using "default" url-pattern (JSP and Servlet requirement)

HandlerList handlers = new HandlerList();
handlers.addHandler(context);
handlers.addHandler(new DefaultHandler()); // for errors when request doesn't match above handlers
server.setHandler(handlers);

但请注意,要在 ServletContextHandler 上启用 JSP,您还有更多工作要做。

详情请参见:https://github.com/jetty-project/embedded-jetty-jsp

关于java - 从 Java Web 项目构建 WAR 和自可执行 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58844177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com