Java 使用Maven Shade插件排除工件未按预期工作

Java 使用Maven Shade插件排除工件未按预期工作,java,maven,maven-shade-plugin,Java,Maven,Maven Shade Plugin,在使用Maven Shade插件构建uber jar时,我试图排除一系列工件。以下是我为此使用的配置: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</ve

在使用Maven Shade插件构建uber jar时,我试图排除一系列工件。以下是我为此使用的配置:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <configuration>
                <createDependencyReducedPom>true</createDependencyReducedPom>
                <artifactSet>
                    <excludes>
                        <exclude>com.fasterxml.jackson.core:jackson-core:jar:2.4.5</exclude>
                    </excludes>
                </artifactSet>
...

org.apache.maven.plugins
maven阴影插件
2.4.3
真的
com.fasterxml.jackson.core:jackson-core:jar:2.4.5
...
排除没有版本信息的软件包工作:

                 <exclude>com.fasterxml.jackson.core:jackson-core</exclude>
com.fasterxml.jackson.core:jackson-core

但不幸的是,这不是一个选项,因为需要包含不同版本的工件。

我认为您只需要定义您正在使用的jackson版本

显然,当您具有不同版本的相同依赖项时(可能是可传递的),这是一种不好的做法。在这种情况下,您无法知道此库的哪个版本将最终出现在您的项目中。您可以替换xml中的依赖项顺序,然后最终结果将不同。听起来不太好,是吗

因此,您需要在DependencyManager部分指定的是杰克逊的确切版本:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
 ...

com.fasterxml.jackson.core
杰克逊核心
${jackson.version}
...
这将确保您的工件中只有特定的版本,并且不需要排除特定的版本


希望这能有所帮助

谢谢Igor,具体使用依赖关系管理确实是这里的解决方案。虽然Maven Shade插件中仍然存在缺陷(或者文档中缺乏清晰性),但我想既然有解决办法,那就不是世界末日了。