使用maven-shade-plugin插件解決spark依賴沖突問題


 

依賴沖突:NoSuchMethodError,ClassNotFoundException

 

      當用戶應用於Spark本身依賴同一個庫時可能會發生依賴沖突,導致程序奔潰。依賴沖突表現為在運行中出現NoSuchMethodError或者ClassNotFoundException的異常或者其他與類加載相關的JVM異常。

此時,若能確定classpath中存在這個包,則錯誤是因為classpath中存在2個不同版本的jar包了,比如常見的log4j,你在classpath中添加了log4j.jar,而spark的lib目錄中也有log4j.jar,而且這2個jar包版本不一致的話,就會出現依賴沖突問題。

 

解決辦法有2種: 
(1)修改你的應用,使其使用的依賴庫的版本與Spark所使用的相同。 
(2)使用稱為shading的方式打包你的應用。使用maven-shade-plugin插件進行高級配置來支持這種打包方式。shading可以讓你以另一種命名空間保留沖突的包,並自動重寫應用的代碼使得它們使用重命名后的版本。這種技術有些簡單粗暴,不過對於解決運行時依賴沖突的問題非常有效。

 

關於maven-shade-plugin插件的詳細介紹請參閱:http://www.jianshu.com/p/7a0e20b30401#

maven-shade-plugin插件的官方介紹:http://maven.apache.org/plugins/maven-shade-plugin/index.html

 

Java 工程經常會遇到第三方Jar 包沖突,使用 maven-shade-plugin 解決 jar 或類的多版本沖突。 maven-shade-plugin 在打包時,可以將項目中依賴的 jar 包中的一些類文件打包到項目構建生成的 jar 包中,在打包的時候把類重命名。

舉例如下:

下面的配置將org.codehaus.plexus.util jar 包重命名為org.shaded.plexus.util。

 

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <relocations>
                                <relocation>
                                    <pattern>org.codehaus.plexus.util</pattern>
                                    <shadedPattern>org.shaded.plexus.util</shadedPattern>
                                    <excludes>
                                        <exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
                                        <exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
                                    </excludes>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM