scala with spark - “javax.servlet.ServletRegistration”的签名者信息与同一包中其他类的签名者信息不匹配

时间:2015-05-18 09:49:17

标签: sql scala apache-spark

我有简单的scala应用程序和spark依赖项。我只是尝试使用以下代码创建spark上下文。

 def main(args: Array[String]) {
    var sparkConfig : SparkConf  = new SparkConf() ;
    sparkConfig.setAppName("ProxySQL").setMaster("local");
    var sc = new SparkContext(sparkConfig) 

     }

当我尝试在main中运行此代码时 - 它会在新的SparkContext(sparkConfig)中抛出安全性执行,并显示以下消息。

Exception in thread "main" java.lang.SecurityException: class "javax.servlet.ServletRegistration"'s signer information does not match signer information of other classes in the same package .

在Eclipse的问题选项卡中,它显示一个警告 描述路径资源位置类型

More than one scala library found in the build path (D:/workspaces/scala/scalaEclipse/eclipse/plugins/org.scala-ide.scala210.jars_4.0.0.201503031935/target/jars/scala-library.jar, C:/Users/prems.bist/.m2/repository/org/scala-lang/scala-library/2.10.4/scala-library-2.10.4.jar).This is not an optimal configuration, try to limit to one Scala library in the build path.     SQLWrapper  Unknown Scala Classpath Problem

我在Windows机器上安装了2.10.4的scala。 在eclipse中设置的Scala编译器版本是2.10.5。导致此安全例外的原因是什么?这是不兼容的版本问题还是其他什么?我该如何解决?

4 个答案:

答案 0 :(得分:11)

问题或多或少与冲突的依赖关系有关。

以下任务解决了我的问题。

  

转到项目

     

构建路径 - >订单和导出标签 - >改变顺序   javax.servlet jar   无论是底部还是顶部。

这解决了这个问题。

答案 1 :(得分:2)

好吧,我遵循以下建议:转到项目构建路径 - >订单和导出标签 - >将javax.servlet jar的顺序更改为bottom或top。

我发现我的buidpath libiaries已被更改,看起来很笨(太多小libs),也许这是由maven造成的。

所以我尝试删除所有这些并重新导入lib并选择Project - > Maven - >更新项目!

现在,进展顺利。

enter image description here

答案 2 :(得分:0)

使用main方法的对象名称应与setAppName(" ProxySQL")相同,也可以使用app扩展它,不要使用main方法,但这只适用于你希望我觉得很容易。

    package spark.sample

    import org.apache.spark.{ SparkContext, SparkConf }

    /**
     * Created by anquegi on 18/05/15.
     */
    object ProxySQL {

      def main(args: Array[String]) {
        var sparkConfig: SparkConf = new SparkConf();

        sparkConfig.setAppName("ProxySQL").setMaster("local");

        var sc = new SparkContext(sparkConfig)

      }

    }

我通常使用和对象喜欢使用Spark

package spark.sample

import org.apache.spark.{ SparkContext, SparkConf }

/**
 * Created by anquegi on 18/05/15.
 */
object ProxySQL extends App {

  val sparkConfig: SparkConf = new SparkConf();

  sparkConfig.setAppName("ProxySQL").setMaster("local[4]");

  val sc = new SparkContext(sparkConfig)

}

我更喜欢使用val而不是var

您也可以使用.setMaster("local[4]")设置主播,而不能只使用一个

答案 3 :(得分:0)

这意味着您没有从应用程序中的某些依赖项中排除Servlet API,并且其中之一每次都会引入它。查看依赖关系树,排除javax.servlet中引入的任何内容。

它应该已经在Spark中可用,并且来自Oracle的特定javax.servlet JAR具有必须删除的签名信息,或者只是排除整个内容。 其中提到了一些库here