我有一个内部开发的.jar。它是使用Maven构建的。它具有从Maven中央存储库提供的依赖项commons编解码器。
.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编解码器的外部依赖项会生成未找到的类def异常。
我尝试将.jar .pom中commons编解码器的范围更改为“编译”,但这无济于事。
我可以通过在.war .pom中添加commons-codec依赖项来解决此问题,但这不是正确的解决方法(我认为),因为它要求所有使用.jar的项目都必须了解此依赖项,并且同样包含它。我也可以在WEB-INF / lib中包含外部.jar来解决此问题,但这似乎也不正确。
处理此问题的最佳方法是什么?为什么.war在运行时看不到通用编解码器依赖性?
此对话似乎涉及一个类似的问题:https://github.com/ReactiveX/RxNetty/issues/292
所以我想知道是否存在正确的方法来处理嵌套依赖项。
但是我只是注意到了这个答案,这似乎显示了正确的方法: https://stackoverflow.com/a/98743/2266428
通过maven-assembly-plug-jar具有依赖关系似乎可以解决问题,但要以很大的.jar(在我的情况下为6 MB)为代价。
答案 0 :(得分:0)
尝试了多种方法之后,事实证明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