为什么我在 included .jar 中的 Maven 依赖项在 final 中找不到。war

Why is my maven dependency in included .jar not found in final .war

我有一个我们内部开发的 .jar。它是使用 maven 构建的。它有一个依赖项,commons-codec,由 Maven 中央存储库提供。

.jar .pom 依赖项 ("myjar"):

<packaging>jar</packaging>
...
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>         
</dependency>
...

.war .pom 依赖:

<packaging>war</packaging>
...
<dependency>
    <groupId>com.myco.mydiv</groupId>
    <artifactId>myjar</artifactId>
    <version>1.5.54</version> 
</dependency>
....

我可以毫无问题地构建和测试这个 jar。当 jar 作为依赖项包含在 .war 中时,它可以毫无问题地构建,但在 运行 时,commons-codec 的外部依赖项会产生 class def not found 异常。

我尝试将 .jar .pom 中的 commons-codec 的范围更改为 'compile' 但这没有帮助。

我可以通过将 commons-codec 依赖添加到 .war .pom 来解决这个问题,但这不是解决它的正确方法(我认为),因为它需要所有使用 .jar 的项目了解这种依赖关系并同样包含它。我也可以在 WEB-INF/lib 中包含外部 .jar 来解决这个问题,但这似乎也是不正确的方法。

处理此问题的最佳方法是什么?为什么在 .war 的 运行 时间看不到通用编解码器依赖项?

这段对话似乎触及了类似的问题:https://github.com/ReactiveX/RxNetty/issues/292

所以我想知道是否有正确的方法来处理嵌套依赖项。

但我刚刚注意到这个答案,它似乎显示了正确的方法:

jar-with-dependencies 通过 maven-assembly-plugin 似乎解决了这个问题,但代价是一个非常大的 .jar(在我的例子中是 6 MB)。

在尝试了多种方法后,事实证明 Shade 插件正是我们所需要的。下面将插件配置添加到我的 .war .pom,完全如图所示,将依赖项添加到 jar 并使其在运行时可供 .war 使用。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <minimizeJar>true</minimizeJar>
        </configuration>
      </execution>
    </executions>
  </plugin>

解压缩初始 .jar 显示以下路径和 类 现在包含在构建中:

org > apache > commmons > codec > *.class