Jetty 不加载任何 servlet

Jetty does not load any servlets

我正在使用安装在 Ubuntu Server LTS 上的 OpenJRE 11 和 Jetty 9。使用此来源:

$ find .
./build.gradle
./gradlew
./src
./src/main
./src/main/java
./src/main/java/com.example
./src/main/java/com.example/servlet
./src/main/java/com.example/servlet/ExampleServlet.java
./src/main/webapp
./src/main/webapp/WEB-INF
./src/main/webapp/WEB-INF/jetty-web.xml
./src/main/webapp/WEB-INF/web.xml

build.gradle:

plugins {
    id 'java'
    id 'war'
}

repositories {
    jcenter()
}

group 'com.example'
version '0.1'

// For Ubuntu's openjdk-11-jre-headless
sourceCompatibility = 1.11

dependencies {
    def jsp_dep = 'org.eclipse.jetty:apache-jsp:9.4.15.v20190215'
    if (gradle.startParameter.taskNames.contains('war')) {
        // Bundled in Ubuntu's libjetty9-java so not embedded
        compileOnly jsp_dep
    }

    // This should not need to be 'implementation'.
    // When hosted in Jetty, this alone is enough to support JSTL. This is a thin reference to
    // org.apache.taglibs:taglibs-standard-{spec,impl}:1.2.5
    implementation 'org.eclipse.jetty:apache-jstl:9.4.15.v20190215'
}

示例Servlet:

package com.example.servlet;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    }
}

码头-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- configure-9_4 is missing -->
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">

</Configure>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!-- https://download.oracle.com/otn-pub/jcp/servlet-4-final-eval-spec/servlet-4_0_FINAL.pdf
-->

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

编译安装:

$ ./gradlew war

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed

$ unzip -l build/libs/jetty-example-0.1.war
Archive:  build/libs/jetty-example-0.1.war
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2019-06-26 14:08   META-INF/
       25  2019-06-26 14:08   META-INF/MANIFEST.MF
        0  2019-06-26 14:08   WEB-INF/
        0  2019-06-26 14:08   WEB-INF/classes/
        0  2019-06-26 14:08   WEB-INF/classes/com/
        0  2019-06-26 14:08   WEB-INF/classes/com/example/
        0  2019-06-26 14:08   WEB-INF/classes/com/example/servlet/
      696  2019-06-26 14:08   WEB-INF/classes/com/example/servlet/ExampleServlet.class
        0  2019-06-26 14:08   WEB-INF/lib/
    12585  2019-05-04 18:20   WEB-INF/lib/apache-jstl-9.4.15.v20190215.jar
    40153  2019-04-15 11:56   WEB-INF/lib/taglibs-standard-spec-1.2.5.jar
   206430  2019-04-15 11:56   WEB-INF/lib/taglibs-standard-impl-1.2.5.jar
      255  2019-06-26 13:55   WEB-INF/jetty-web.xml
      444  2019-06-26 14:03   WEB-INF/web.xml
---------                     -------
   260588                     14 files

$ mv jetty-example-0.1.war root.war
$ chmod 644 root.war
# chown jetty:adm root.war
# mv root.war /var/lib/jetty9/webapps/

# ls -la /tmp/systemd-private-*jetty9.service*/tmp/*root.war*
total 12
drwxr-xr-x 3 jetty jetty 4096 Jun 26 14:08 .
drwxrwxrwt 6 root  root  4096 Jun 26 14:08 ..
drwxr-xr-x 2 jetty jetty 4096 Jun 26 14:08 jsp

然后访问 127.0.0.1:8080/example 时,我得到 Jetty 的默认 404 页面,这让我相信默认情况下不会进行包扫描。在 /var/log/syslog 我收到这些消息:

Jun 26 14:07:07 web jetty9[475]: 2019-06-26 14:07:07.980:INFO:oejshC.root:Scanner-0: Warning: No org.apache.tomcat.JarScanner set in ServletContext. Falling back to default JarScanner implementation.
Jun 26 14:07:08 web jetty9[475]: 2019-06-26 14:07:08.162:INFO:oajs.TldScanner:Scanner-0: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Jun 26 14:07:08 web jetty9[475]: 2019-06-26 14:07:08.204:INFO:oejsh.ContextHandler:Scanner-0: Started o.e.j.w.WebAppContext@156a87be{root,/,file:///var/lib/jetty9/webapps/root/,AVAILABLE}{/root}
Jun 26 14:07:08 web jetty9[475]: 2019-06-26 14:07:08.280:INFO:oejsh.ContextHandler:Scanner-0: Stopped o.e.j.w.WebAppContext@7f3b84b8{root,/,null,UNAVAILABLE}{/root.war}
Jun 26 14:08:29 web jetty9[475]: 2019-06-26 14:08:29.532:INFO:oeja.AnnotationConfiguration:Scanner-0: Scanning elapsed time=28ms
Jun 26 14:08:29 web jetty9[475]: 2019-06-26 14:08:29.564:INFO:oejshC.root:Scanner-0: Warning: No org.apache.tomcat.JarScanner set in ServletContext. Falling back to default JarScanner implementation.
Jun 26 14:08:29 web jetty9[475]: 2019-06-26 14:08:29.725:INFO:oajs.TldScanner:Scanner-0: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Jun 26 14:08:29 web jetty9[475]: 2019-06-26 14:08:29.782:INFO:oejsh.ContextHandler:Scanner-0: Started o.e.j.w.WebAppContext@42e87462{root,/,file:///var/lib/jetty9/webapps/root/,AVAILABLE}{/root.war}

为什么默认的 jar 扫描不起作用,我该如何解决?

事实证明:不是包裹扫描出了问题;这是一个相互矛盾的背景。不知何故,Jetty 认为两个重叠的上下文应该默默地失败。在我的特殊情况下,Jetty 中有一个默认的 root 目录,其中包含一个示例 Web 应用程序。删除它解决了问题。