为什么在最终.war中找不到我包含在.jar中的maven依赖项

时间:2018-07-12 16:36:21

标签: java maven jar pom.xml war

我有一个内部开发的.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)为代价。

1 个答案:

答案 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