maven shade插件-不重新定位排除的/可选的范围依赖项

50few1ms  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(395)

我使用maven shade插件来创建一个uberjar,同时重新定位所有类。这是因为我得到了一个外部jar,我不想有类路径冲突。因此,我们的想法是创建一个新的uber(重新定位的)jar并在我的应用程序中使用它。因此shade插件接受所有类并将它们重新定位到新的包前缀。我的问题是,据我所知,它们所依赖的类也不在[*]范围内。
假设我要重新安置 comshade.com :

<executions>
  <execution>
    <id>rename-all</id>
    <phase>package</phase>
    <goals>
      <goal>shade</goal>
    </goals>
    <configuration>
      <shadedArtifactAttached>true</shadedArtifactAttached>
      <keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
        <relocations>
          <relocation>
            <pattern>com</pattern>
            <shadedPattern>shade/com</shadedPattern>
          </relocation>
        </relocations>
        </configuration>
    </execution>
</executions>

所以如果我的一个依赖项,a,有一个 <optional> 依赖于b(哪个包 com.B ),插件会将 shade.com.B . 但是com.b是可选的,这意味着这些类在中不可用 shade.com.B ,因为他们没有参与搬迁过程。当使用这个jar时,实际可用的类将是“普通”类- com.B . 然后我得到类未发现的异常 shade.com.B 当我尝试在应用程序中使用着色jar时。
我的理解有什么遗漏吗?有什么解决办法吗?
[*]一些例子:我还不确定发生这种情况的确切情况。就我而言,我依靠 spark-sql 附属国。我深入研究了我在本期中看到的3个类(还有更多): org/apache/html/dom/HTMLIsIndexElementImpl 进口 org.w3c.dom.html.HTMLIsIndexElement 哪个在 rt.jar -导入已重新定位,因此现在它指向 shade.org.w3c.dom.html.HTMLIsIndexElement 却找不到。 io/netty/handler/codec/marshalling/ChannelBufferByteOutput 进口 org.jboss.marshalling.ByteOutput . 因此搬迁改为 import shade.org.jboss.marshalling.ByteOutput . 但从这里可以看出 jboss-marshalling 标记为 <optional>true</optional> 所以它不在jar里 ByteOutput 它本身不会被重新定位,因此不可用。 jasper-runtime 包括在这里,但不包括在上面的一个,这里。因此结果是hadoop hdfs中的文件被重新定位到它们的依赖项,即使这些类在重新定位的路径中永远不可用,因为它们根本不在jar中。例如 org/apache/hadoop/hdfs/server/datanode/browseBlock_jsp 现在有一个对“shade/org/apache/jasper/runtime/jspsourcedependent”的引用。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题