代码之家  ›  专栏  ›  技术社区  ›  J E Carter II

为什么我对include.jar的依赖在final.war中找不到?

  •  0
  • J E Carter II  · 技术社区  · 6 年前

    我有一个自制的罐子。它是使用maven构建的。它有一个从Maven中央存储库提供的依赖项commons codec。

    .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的外部依赖项会生成一个类def not found异常。

    我尝试将.jar.pom中的commons编解码器的作用域更改为“compile”,但这没有帮助。

    我可以通过向.war.pom添加commons编解码器依赖项来解决这个问题,但这不是解决它的正确方法(我认为),因为它需要使用.jar的所有项目了解这个依赖项并将其包含在内。我也可以在WEB-INF/lib中包含external.jar来解决这个问题,但这似乎也是不正确的方法。

    最好的方法是什么?为什么在.war的运行时通用编解码器依赖项不可见?

    这次谈话似乎涉及到一个类似的问题: https://github.com/ReactiveX/RxNetty/issues/292

    所以我想知道是否有一个正确的方法来处理这个嵌套的依赖关系。

    但我注意到了这个答案,它似乎显示了正确的方法: https://stackoverflow.com/a/98743/2266428

    通过Maven程序集插件的依赖jar似乎解决了这个问题,但代价是非常大的.jar(在我的例子中是6 MB)。

    1 回复  |  直到 6 年前
        1
  •  0
  •   J E Carter II    6 年前

    在尝试了多种方法之后,结果发现shade插件正是需要的。下面将插件配置添加到my.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>
    

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

    org > apache > commmons > codec > *.class