我使用maven shade插件来创建一个uberjar,同时重新定位所有类。这是因为我得到了一个外部jar,我不想有类路径冲突。因此,我们的想法是创建一个新的uber(重新定位的)jar并在我的应用程序中使用它。因此shade插件接受所有类并将它们重新定位到新的包前缀。我的问题是,据我所知,它们所依赖的类也不在[*]范围内。
假设我要重新安置 com
至 shade.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”的引用。
暂无答案!
目前还没有任何答案,快来回答吧!