【问题标题】:Where are servlet and JAX-RS dependencies coming from?servlet 和 JAX-RS 依赖项来自哪里?
【发布时间】:2017-03-22 06:10:25
【问题描述】:

如果我在我的应用程序中包含以下 J2EE 依赖项,我就可以访问 servlet 和 JAX-RS 类和接口:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>

但他们来自哪里?在 Maven Central 上,我看到 javax:javaee-api:7.0 具有依赖关系 javax:javaee-web-api:7.0,而后者又具有依赖关系 javax.servlet:javax.servlet-api:3.1.0 和 javax.ws.rs:javax.ws.rs-api:2.0,所以从表面上看,这就是答案。

但所有这些依赖项都标记为 optional,这意味着作为传递依赖项,除非我明确包含它们,否则它们不会出现在我的项目中。但是我的程序编译时只是依赖于javax:javaee-api:7.0。为什么?

这是我的依赖树;我看不出他们是从哪里进来的:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ temp-server ---
[INFO] com.example:test-server:war:1.0.0-SNAPSHOT
[INFO] +- com.google.code.findbugs:jsr305:jar:3.0.1:provided
[INFO] \- javax:javaee-api:jar:7.0:compile
[INFO]    \- com.sun.mail:javax.mail:jar:1.5.0:compile
[INFO]       \- javax.activation:activation:jar:1.1:compile

(这都是基本的东西;我不知道为什么我会感到困惑。我一定遗漏了一些明显的东西。)

【问题讨论】:

  • 你具体说的是哪一门课?

标签: java maven servlets jakarta-ee jax-rs


【解决方案1】:

由于JAX-RS 2.0 是Java EE 7 的一部分,定义其API 的类直接包含在工件javax:javaee-api:7.0 中,因此只要您只使用标准类就足以编译您的程序。

【讨论】:

  • 因此,例如,JAX-RS 类在javax:javaee-api:7.0 和javax.ws.rs:javax.ws.rs-api:2.0 中重复? (我猜他们这样做是为了防止有人没有依赖管理?)
  • 它们只是您已经提到的optional 依赖项,所以我不这么认为,但无论如何它应该被定义为provided,所以这并不重要。我猜javax.ws.rs:javax.ws.rs-api:2.0 是供做纯 JX-RS 应用程序或不想拥有完整 API 编译的人使用的
  • “重复”是指 Java 在 javax:javaee-api:7.0 和 javax.ws.rs:javax.ws.rs-api:2.0 中都包含了 JAX-RS .class 文件,尽管前者将后者作为依赖项包含在内。这回答了我的问题;我没有考虑过.class 文件会在两个JAR 文件中,因为一个是另一个的依赖项。感谢您指出这一点。
【解决方案2】:

在这里,您需要了解&lt;scope&gt;provided&lt;/scope&gt; 的含义。当包含 javaee-api 依赖项时,javax.servlet:javax.servlet-api:3.1.0 和 javax.ws.rs:javax.ws.rs-api:2.0 将包含在 provided 的范围内。这意味着,ONLY 在编译您的类时,将使用这些 jar 文件,而在运行时不。由于作用域是provided,它预计这两个jar 将由运行时环境给出。重申一下,当任何 jar 包含在provided 的范围内时,这意味着该 jar 应该用于编译,但对于运行时,它应该由运行时容器提供。

现在回答您的问题,如果您考虑任何运行时环境容器,例如 JBOSS、WAS 等,它们都与这些 jar 捆绑在一起。所以在编译你的类时,它会使用作为javaee-api的传递依赖的jar,但在运行时它会使用与容器捆绑在一起的jar。因此,您不会收到任何错误。

【讨论】:

  • 我了解&lt;scope&gt;provided&lt;/scope&gt;,但这完全是问题所在。这个问题是关于&lt;optional&gt;。它是关于编译时而不是运行时的依赖关系。请重新阅读问题。您的回答非常好——针对不同的问题。
  • @Garett,您是否在应用程序中使用这些可选 jar 中的任何类?
  • 这只是一个问题,以了解我的编译器如何查看javax.ws.rs:javax.ws.rs-api:2.0 中的文件,这些文件从javax:javaee-api:7.0 向下两层传递引用(但使用optional)。答案(由 Nicolas Filotto 给出)是相关类也包含在javax:javaee-api:7.0 中,因此它们不被包含在传递中。我已经习惯了良好的模块化,以至于我没有考虑到 JAX-RS 类可能包含在 both jar 中,即使其中一个引用了另一个。故事结局。问题已回答。
猜你喜欢
  • 2021-02-23
  • 2015-05-19
  • 2017-03-28
  • 2016-01-22
  • 1970-01-01
  • 2014-03-25
  • 2016-05-07
  • 1970-01-01
  • 2015-01-25
相关资源
最近更新 更多