[英]How to avoid maven shade plugin from including transitive dependencies from 'test-jar' types?
I am working on a multi-module Maven project which has intermodule dependencies.我正在开发一个具有模块间依赖关系的多模块 Maven 项目。 For example: One of the project's module, say spark-module
has a dependency on another module (say core-module
) from the same project.例如:项目的一个模块,比如spark-module
依赖于来自同一项目的另一个模块(比如core-module
)。
The core-module
has a dependency on jackson-datatype-jsr310:2.8.11
and in the spark-module
, I have added the test-jars from the Apache Spark project - spark-sql_2.11:2.4.0
, spark-core_2.11:2.4.0
, spark-catalyst_2.11:2.4.0
for unit testing purpose. core-module
依赖于jackson-datatype-jsr310:2.8.11
并且在spark-module
中,我添加了来自 Apache Spark 项目的测试罐 - spark-sql_2.11:2.4.0
, spark-core_2.11:2.4.0
, spark-catalyst_2.11:2.4.0
用于单元测试目的。 As you see, these Spark modules are all of version 2.4.0 which internally uses jackson-databind:2.6.7.1
.如您所见,这些 Spark 模块都是 2.4.0 版本,内部使用jackson-databind:2.6.7.1
。 Please refer the POM provided below:请参考下面提供的 POM:
Parent家长
<?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>com.sample</groupId>
<artifactId>spark-test</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>core-module</module>
<module>spark-module</module>
</modules>
</project>
core-module核心模块
<?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">
<parent>
<artifactId>spark-test</artifactId>
<groupId>com.sample</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>core-module</artifactId>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.11</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
</project>
spark-module火花模块
<?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">
<parent>
<artifactId>spark-test</artifactId>
<groupId>com.sample</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spark-module</artifactId>
<dependencies>
<dependency>
<groupId>com.sample</groupId>
<artifactId>core-module</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.4.0</version>
<scope>provided</scope>
</dependency>
<!-- Test dependencies -->
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_2.11</artifactId>
<version>3.0.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.holdenkarau</groupId>
<artifactId>spark-testing-base_2.11</artifactId>
<version>2.4.0_0.12.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.4.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-catalyst_2.11</artifactId>
<version>2.4.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.scalatest</groupId>
<artifactId>scalatest-maven-plugin</artifactId>
<version>2.0.0</version>
<configuration>
<reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
<junitxml>.</junitxml>
<filereports>WDF TestSuite.txt</filereports>
</configuration>
<executions>
<execution>
<id>test</id>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>org.apache.spark:*</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Now when I build spark-module
, when maven shade plugin kicks in, it includes the jackson-databind:2.6.7.1
instead of 2.8.11 (I thought it would come from core-module
).现在,当我构建spark-module
时,当 maven 阴影插件启动时,它包含jackson-databind:2.6.7.1
而不是 2.8.11 (我认为它来自core-module
)。 When I add the following exclusions to the test-jar
dependencies, it properly bundles the 2.8.11 version JAR but that makes my tests fail since the dependencies are excluded:当我将以下排除项添加到test-jar
依赖项时,它会正确捆绑 2.8.11 版本 JAR 但这会使我的测试失败,因为排除了依赖项:
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
Maybe I'm doing something wrong with the way the dependencies are handled.也许我在处理依赖项的方式上做错了。 So can you please help me understand what should be done here?那么你能帮我理解这里应该做什么吗?
To control the version of jackson-databind
, add an entry to the <dependencyManagement>
section in which you specify the version you want.要控制jackson-databind
的版本,请在<dependencyManagement>
部分添加一个条目,在该部分中指定所需的版本。 This will override all transitive definitions and is much easier to handle than various exclusions.这将覆盖所有传递定义,并且比各种排除更容易处理。
So in the first step, you can try to set it to <version>2.8.11</version>
and try if your tests work.因此,在第一步中,您可以尝试将其设置为<version>2.8.11</version>
并尝试您的测试是否有效。 If not, then you need to figure out a "middle version" that works both for the applications in core-module
and your tests.如果没有,那么您需要找出一个“中间版本”,它既适用于core-module
中的应用程序,也适用于您的测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.