为什么Java 8和Java 11之间解析的依赖项不同?
给定一个非常简单的Maven项目,其中有一个pom文件,其中包含一个依赖项:为什么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"
<?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文件只有一个依赖项,树差异的原因实际上是因为单个依赖项中的激活配置文件。请参阅我的答案:。我想我也会打你,因为你是这个答案讨论的一部分。