繁体   English   中英

编译 Jetty 嵌入式应用程序时出错:org.eclipse.jetty.server 从 jetty.servlet.api 和 jakarta.servlet 读取 package jakarta.servlet

[英]Error compilling Jetty embeded application : org.eclipse.jetty.server reads package jakarta.servlet from both jetty.servlet.api and jakarta.servlet

我正在构建一个带有 Maven 的嵌入式 Jetty 应用程序。jetty.version:11.0.13 servlet-api.version:5.0.0。

这是一个多模块项目。

一个名为“utils”的 maven 模块依赖于 jakarta.servlet-api 进行编译(范围已提供)。 java 模块需要 jakarta.servlet。

// 实用程序的 pom.xml

    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>${servlet-api.version}</version>
        <scope>provided</scope>
    </dependency>

maven “应用程序”模块添加了以下依赖项和其他。

// 应用程序的 pom.xml

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>${jetty.version}</version>
    </dependency>

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-http</artifactId>
        <version>${jetty.version}</version>
    </dependency>

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>${jetty.version}</version>
    </dependency>

另一个显式依赖项之一取决于“utils”maven 模块。

该应用程序的 Java 模块包含:

requires utils;
requires org.eclipse.jetty.http;
requires org.eclipse.jetty.server;
requires org.eclipse.jetty.servlet;

当我编译应用程序时,所有依赖模块都编译正常,但在编译最后一个模块(应用程序)时出现此错误:

myapplication.BlaBla.java:[46,17] 无法访问 jakarta.servlet.http.HttpServlet class 找不到 jakarta.servlet.http.HttpServlet 文件

如果我添加以下依赖项:

    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>${servlet-api.version}</version>
        <scope>provided</scope>
    </dependency>

并将以下行添加到我的应用程序模块中:

requires jakarta.servlet;

我的编辑警告说:

模块“application”从“jetty.servlet.api”和“jakarta.servlet”中读取 package“jakarta.servlet”

并且构建显然失败并出现许多错误消息,例如:

[ERROR] module org.eclipse.jetty.server reads package jakarta.servlet from both jetty.servlet.api and jakarta.servlet [ERROR] module org.eclipse.jetty.server reads package jakarta.servlet.http from both jetty.servlet .api and jakarta.servlet [ERROR] module org.eclipse.jetty.server reads package jakarta.servlet.descriptor from both jetty.servlet.api and jakarta.servlet [ERROR] module org.eclipse.jetty.server reads package jakarta.来自 jetty.servlet.api 和 jakarta.servlet 的 servlet.annotation [...

如果我查看 jetty.servlet.api jar 文件,我看不到名为 jakarta.servlet 的 package。

我确实注意到“jetty-jakarta-servlet-api-5.0.2.jar”包含 jakarta.servlet 类,但我不知道在我的构建过程中使用它。

帮助?

似乎您正在尝试让 JPMS 与 Jetty 11 一起工作。

requires jakarta.servlet; 关于"module <blah> reads package <blah> from both <foo1> and <foo2>"的错误告诉我这个。

这是您需要知道的。

来自 Maven Central 的 Jakarta Servlet 5.0.0的标准神器是...

<dependency>
  <groupId>jakarta.servlet</groupId>
  <artifactId>jakarta.servlet-api</artifactId>
  <version>5.0.0</version>
</dependency>

这提供了(在 JPMS 术语中)名称jakarta.servlet

查看该文件中的META-INF/MANIFEST.MF ,您会看到该行

Automatic-Module-Name: jakarta.servlet

由于...,这种依赖性(不幸的是)并不是为 JPMS 设计的。

  1. 它缺少正确的module-info.class (该文件不存在于官方依赖项中)
  2. 它依赖于将名称jakarta.servlet声明为自动模块名称。 (基本上保留名称以供以后升级到正确的module-info.class
  3. 导出jar中的每个package,不提供JPMS opens call
  4. 缺少正确执行 Jakarta Servlet 容器所需的模式

(顺便说一句,即将推出的 Jakarta Servlet 6.0 已经解决了这个问题)。

那我为什么要告诉你这个?

Jetty 是 JPMS 的早期采用者,不得不解决 Jakarta Servlet 5.0 的一些缺陷。

一个是缺少的module-info.class ,另一个是缺少的模式(官方 Jakarta Servlet 5.0 中不存在)

运行 Jetty 服务器时jakarta.servlet (JPMS 模块名称)版本 5.0 的替代品是......

<dependency>
  <groupId>org.eclipse.jetty.toolchain</groupId>
  <artifactId>jetty-jakarta-servlet-api</artifactId>
  <version>5.0.2</version>
</dependency>

在实现 Jetty 服务器时使用它(就像您使用嵌入式 Jetty 一样),并且根本不要使用官方依赖项。

Jetty Jakarta Servlet API 5.0.2 有一个module-info.class声明如下。

module jetty.servlet.api {
  exports jakarta.servlet;
  exports jakarta.servlet.annotation;
  exports jakarta.servlet.descriptor;
  exports jakarta.servlet.http;
  exports jakarta.servlet.resources;
  //open resources so Class.getResource() can access them
  opens jakarta.servlet.resources;
}

将来,当您升级到 Jetty 12(目前处于 alpha 版本)时,您可以使用官方的jakarta.servlet依赖项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM