如果我在应用程序中包含以下J2EE依赖项,则可以访问servlet和JAX类和接口:
    <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(这些都是基本的东西,我不知道为什么我会感到困惑。我一定漏掉了一些显而易见的东西。)
发布于 2016-11-08 14:58:58
由于JAX-RS 2.0是Java EE 7的一部分,定义其API的类直接包含在工件javax:javaee-api:7.0中,因此只要只使用标准类,编译程序就足够了。
发布于 2016-11-08 15:29:49
在这里,您需要理解<scope>provided</scope>的含义。当包含javax.servlet:javax.servlet-api:3.1.0依赖项时,javax.ws.rs:javax.ws.rs-api:2.0和javaee-api将以provided的形式包含。这意味着,在编译类时,只使用,在运行时将使用这些jar文件,而不是。因为范围是provided,所以它期望这两个jars将由运行时环境提供。为了重新迭代,当任何jar作为provided包含在作用域中时,这意味着这个jar应该用于编译,但是对于运行时,它希望由运行时容器提供。
现在要回答您的问题,如果您考虑任何运行时环境容器(如JBOSS、WAS等),它们都与这些jars捆绑在一起。因此,在编译类时,它将使用作为javaee-api传递依赖项的jars,但在运行时,它将使用与容器捆绑在一起的jars。因此,您不会遇到任何错误。
https://stackoverflow.com/questions/40489925
复制相似问题