gpt4 book ai didi

java - 为什么 maven-war-plugin 的行为不同于标准的 maven 依赖解析机制

转载 作者:行者123 更新时间:2023-11-30 08:59:26 25 4
gpt4 key购买 nike

maven-war-plugin 的行为与标准 maven 依赖项解析机制不同是否有原因?我有一个具有依赖性的 war maven 项目:

    <dependency>
<groupId>GroupA</groupId>
<artifactId>DependencyA</artifactId>
<exclusions>
<exclusion>
<groupId>GroupB</groupId>
<artifactId>DependencyB</artifactId>
</exclusion>
</exclusions>
</dependency>

上述依赖被正确排除,我可以在依赖层次结构 View 上进行验证。当我用 Maven 构建 war 时,它在 WEB-INF/lib 目录中包含 DependencyB,因此我必须明确定义以使用 maven-war-plugin 排除它:

        <plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<packagingExcludes>
WEB-INF/lib/dependencyB.jar,
</packagingExcludes>
</configuration>
</plugin>

我必须执行上述操作,因为我的项目中出现了版本之间的冲突。为什么会这样?还有其他方法可以实现吗?


更新

所以我创建了一个测试用例来向您展示我的意思,如果我之前不够清楚的话。对应的pom如下:

Artifact A:

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>GroupA</groupId>
<artifactId>ArtifactA</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ArtifactA Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>GroupB</groupId>
<artifactId>ArtifactB</artifactId>
<type>war</type>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>GroupC</groupId>
<artifactId>ArtifactC</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>


<build>
<finalName>ArtifactA</finalName>
</build>

Artifact B

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>GroupB</groupId>
<artifactId>ArtifactB</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>ArtifactB Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>GroupC</groupId>
<artifactId>ArtifactC</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>ArtifactB</finalName>
</build>

ArtifactC

<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>GroupC</groupId>
<artifactId>ArtifactC</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>ArtifatcC</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

在 Eclipse 的依赖层次结构中,我没有看到依赖 ArtifactC。 enter image description here

在构建 ArtifactA 和解压缩 .war 时,我得到: enter image description here

如您所见,传递依赖包含在 WEB-INF/lib 的 .war 中。我希望现在更清楚了。

要补充的一些其他细节:

  1. 我正在从 eclipse 调用 maven
  2. maven-war-plugin 版本 2.1.1,也测试了 2.5
  3. Eclipse 中嵌入了 Maven 版本 3.0.4

最佳答案

问题不在于 war 插件以不同方式处理依赖项排除,而是它处理 <type>war</type> 的依赖项特别。它创建了一个 war overlay在这些之外,这意味着它获取了 war 的全部内容并将项目网络资源放在首位。 war 依赖确实没有传递依赖,它已经包含了所有的 jar 文件。

如果使用 war 叠加层确实是您的意图,那么使用 packagingExcludes是正确的解决方案。如果您想依赖 Artifact B 中的类,那么您应该修改 pom,以便它创建一个单独的 Artifact (使用 attachClasses configuration )并依赖于此 classes人工制品。传递依赖项的排除应该与任何其他 jar 依赖项一样工作。

关于java - 为什么 maven-war-plugin 的行为不同于标准的 maven 依赖解析机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27281367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com