使用maven shade plugin打包uber jar包

最近项目需要,在使用spark编写Java应用时,最终编写的程序必须打包成一个jar包才能提交到spark集群运行。由于spark是一个分布式系统,提交的程序最终将分散到许多节点上运行,如果程序依赖其他jar包,那么运行环境的部署将会非常头痛。为此,spark使用文档里建议将应用打包成assembly jar或者uber jar再提交。


经查,assembly jar包似乎比uber jar包更为简单,于是先尝试这个,使用maven assembly plugin打包。打包成功后,运行,提示缺少配置文件错误。在eclipse运行spark应用时并没有提示该类错误。再查,得知该配置文件包含在spark某个jar包里,要把配置文件打包到jar包,只有使用shade plugin打包成uber jar。


maven shade plugin使用也比较简单,文档在http://maven.apache.org/plugins/maven-shade-plugin/中有详细介绍。使用这个打包自己的项目,将会在项目的target中产生两个jar包,一个为。

  
    
      
        org.apache.maven.plugins
        maven-shade-plugin
        2.1
        
          
            package
            
              shade
            
            
              true
                  all
              false
              false
              
                
                  mysql:mysql-connector-java
                  org.apache.spark:spark-streaming-kafka_2.10
                
              
              
              
                
                  *:*
                  
                    META-INF/*.SF
                    META-INF/*.DSA
                    META-INF/*.RSA
                  
                
              

              
                
                  reference.conf
                
                
                  com.bj58.spat.sparkstreaming.SparkKafkaUrlCount
                
              
            
          
        
      
    
  


结果并不顺利,提交应用程序到spark平台,仍提示缺少很多包。原因在于,依赖的spark-core、spark-streaming等jar包又依赖了其他许多jar包。如图所示:

使用maven shade plugin打包uber jar包_第1张图片


依赖的jar包有好几十个,似乎要在pom文件里逐一指定才行。想了个简单猥琐的办法,在shade plugin的配置中添加了1行(*:*):

  
    
      
        org.apache.maven.plugins
        maven-shade-plugin
        2.1
        
          
            package
            
              shade
            
            
              true
                  all
              false
              false
              
                
                  mysql:mysql-connector-java
                  org.apache.spark:spark-streaming-kafka_2.10
                  *:*
                
              
              
              
                
                  *:*
                  
                    META-INF/*.SF
                    META-INF/*.DSA
                    META-INF/*.RSA
                  
                
              

              
                
                  reference.conf
                
                
                  com.bj58.spat.sparkstreaming.SparkKafkaUrlCount
                
              
            
          
        
      
    
  



再次运行mvn package打包,用jar tf your-jar-name.jar查看uber jar包包含的类,有很多很多,程序里需要用到的一个也不缺了。OK,将这个jar包提交到spark平台,妥妥地运行成功了。

你可能感兴趣的:(使用maven shade plugin打包uber jar包)