为什么我在 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
我有一个我们内部开发的 .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