Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java 8和Java 11之间解析的依赖项不同?_Java_Maven_Java 8_Dependencies_Java 11 - Fatal编程技术网

为什么Java 8和Java 11之间解析的依赖项不同?

为什么Java 8和Java 11之间解析的依赖项不同?,java,maven,java-8,dependencies,java-11,Java,Maven,Java 8,Dependencies,Java 11,给定一个非常简单的Maven项目,其中有一个pom文件,其中包含一个依赖项: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

给定一个非常简单的Maven项目,其中有一个pom文件,其中包含一个依赖项:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>maven-test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>org.apache.cxf.xjc-utils</groupId>
      <artifactId>cxf-xjc-runtime</artifactId>
      <version>3.3.0</version>
    </dependency>
  </dependencies>

</project>
<dependency>
  <groupId>org.apache.cxf.xjc-utils</groupId>
  <artifactId>cxf-xjc-runtime</artifactId>
  <version>3.3.0</version>
</dependency>
使用Java 11:

[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< org.example:maven-test >-----------------------
[INFO] Building maven-test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-test ---
[INFO] org.example:maven-test:jar:1.0-SNAPSHOT
[INFO] \- org.apache.cxf.xjc-utils:cxf-xjc-runtime:jar:3.3.0:compile
[INFO]    \- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO]       \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.982 s
[INFO] Finished at: 2020-06-22T15:05:56+02:00
[INFO] ------------------------------------------------------------------------
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< org.example:maven-test >-----------------------
[INFO] Building maven-test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ maven-test ---
[INFO] org.example:maven-test:jar:1.0-SNAPSHOT
[INFO] \- org.apache.cxf.xjc-utils:cxf-xjc-runtime:jar:3.3.0:compile
[INFO]    +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
[INFO]    |  \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
[INFO]    +- javax.annotation:javax.annotation-api:jar:1.3.1:compile           <-- This and below only with Java 11
[INFO]    +- javax.xml.ws:jaxws-api:jar:2.3.0:compile
[INFO]    |  +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
[INFO]    |  \- javax.xml.soap:javax.xml.soap-api:jar:1.4.0:compile
[INFO]    \- javax.activation:activation:jar:1.1.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.261 s
[INFO] Finished at: 2020-06-22T15:05:51+02:00
[INFO] ------------------------------------------------------------------------
[INFO]正在扫描项目。。。
[信息]
[信息]-------------------------------------------------
[信息]构建maven测试1.0-SNAPSHOT
[信息]------------------------------------[jar]---------------------------------
[信息]
[信息]---maven依赖插件:2.8:tree(默认cli)@maven测试---
[INFO]org.example:maven测试:jar:1.0-SNAPSHOT
[INFO]\-org.apache.cxf.xjc utils:cxf-xjc运行时:jar:3.3.0:compile
[INFO]+-jakarta.xml.bind:jakarta.xml.bindapi:jar:2.3.2:compile
[INFO]\-jakarta.activation:jakarta.activationAPI:jar:1.2.1:compile

[INFO]+-javax.annotation:javax.annotation api:jar:1.3.1:compile依赖关系树如果依赖关系已经存在于树的较高位置,mojo会修剪较低级别的依赖关系

我们可以使用verbose标志(
-Dverbose
)来显示排除的依赖项

要查找特定工件:
mvn依赖项:tree-Dverbose-Dincludes=[groupId]:[artifactId]:[type]:[version]


请访问以了解更多信息。

在依赖关系中可以找到Java版本之间依赖关系树不同的原因:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>maven-test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>org.apache.cxf.xjc-utils</groupId>
      <artifactId>cxf-xjc-runtime</artifactId>
      <version>3.3.0</version>
    </dependency>
  </dependencies>

</project>
<dependency>
  <groupId>org.apache.cxf.xjc-utils</groupId>
  <artifactId>cxf-xjc-runtime</artifactId>
  <version>3.3.0</version>
</dependency>
在这个POM文件中,我们找到了使用Java 8构建时排除的依赖项:

<profile>
    <id>java9-plus</id>
    <activation>
        <jdk>[9,)</jdk>
    </activation>
    <dependencies>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.ws</groupId>
            <artifactId>jaxws-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
 </profile>

有关激活的更多信息,请访问:

激活是配置文件的关键。配置文件的威力来自于它仅在特定情况下修改基本POM的能力。这些情况通过
激活
元素指定

以及另一个基于Java版本的激活示例:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <profiles>
    <profile>
      <id>test</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.5</jdk>
        <os>
          <name>Windows XP</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>sparrow-type</name>
          <value>African</value>
        </property>
        <file>
          <exists>${basedir}/file2.properties</exists>
          <missing>${basedir}/file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
</project>

...
测试
假的
1.5
视窗XP
窗户
x86
5.1.2600
麻雀型
非洲的
${basedir}/file2.properties
${basedir}/file1.properties
...

很可能是因为
+-javax.annotation:javax.annotation api
+-javax.xml.ws:jaxws-api
\-javax.activation:activation
不再是11中JDK的一部分@Naman您提到的两个依赖项的类在Java8的rt.jar中,当然,Java11已经删除了它们。Maven是否足够聪明,可以“解析”rt.jar并排除这些依赖项?这可以解释这种行为。@Naman我认为不需要一个示例项目。pom文件是唯一的文件,可以轻松地进行复制粘贴。如果依赖项在树中的较高位置已经存在,则依赖项树mojo会修剪较低级别的依赖项。请确保@BasilBourque。完成!很好,不过再多了解一些细节就好了。也许是做文档的引文。增加了澄清的细节。如果有不清楚/需要更新的地方,请告诉我。pom中没有任何其他依赖项。但是有一点不同,那就是
javax.annotation api
activation
的源代码可以在Java8JDK中找到,但在Java11JDK中找不到。因此,我猜必须发生的是Maven检测到了这一点并排除了依赖项。这是怎么做到的?有消息来源吗?@BasilBourque虽然这个答案确实是正确的,但它并不是我问题的答案。pom文件只有一个依赖项,树差异的原因实际上是因为单个依赖项中的激活配置文件。请参阅我的答案:。我想我也会打你,因为你是这个答案讨论的一部分。