uber jar

时间:2016-12-19 16:49:45

标签: scala maven selenium ssl apache-spark

这些dependencies里面是我的pom.xml文件。当我从我的maven项目中运行Driver作为Scala应用程序时,它运行正常。但是,当我创建jar-with-dependency并尝试通过spark-submit

运行我的项目时
spark-submit --class package.signature.Driver --master local[*] /path/to/my/jar-with-dependencies.jar

我得到以下例外。

  

线程中的异常" main" java.lang.NoSuchMethodError:   。org.apache.http.conn.ssl.SSLConnectionSocketFactory(Ljavax /净/ SSL /的SSLContext; [Ljava /郎/字符串; [Ljava /郎/字符串; Ljavax /净/ SSL /的HostnameVerifier;)V     在   com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory。(HtmlUnitSSLConnectionSocketFactory.java:125)     在   com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.buildSSLSocketFactory(HtmlUnitSSLConnectionSocketFactory.java:112)     在   com.gargoylesoftware.htmlunit.HttpWebConnection.configureHttpsScheme(HttpWebConnection.java:597)     在   com.gargoylesoftware.htmlunit.HttpWebConnection.createHttpClient(HttpWebConnection.java:532)     在   com.gargoylesoftware.htmlunit.HttpWebConnection.getHttpClientBuilder(HttpWebConnection.java:494)     在   com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:158)     在   com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1321)     在   com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1238)     在   com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:346)     在   com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:415)     在   org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:541)     在   org.openqa.selenium.htmlunit.HtmlUnitDriver.get(HtmlUnitDriver.java:530)

此异常的来源是代码

中的.getPageSource
import org.openqa.selenium.htmlunit.HtmlUnitDriver
import java.util.concurrent.TimeUnit
import scala.concurrent.duration._
import org.apache.spark.Logging

object Selenium extends Logging {
  val driver = new HtmlUnitDriver(false)
  val implicitWaitTimeout = 30 // seconds
  driver.manage.timeouts.implicitlyWait(implicitWaitTimeout, TimeUnit.SECONDS)
  def getPageSource(urlPage: String): String = {
    driver.get(urlPage)
    driver.getPageSource
  }
}

到目前为止我尝试了什么。 试图排除apache-httpcomponent的多个版本。但这没有用。

2 个答案:

答案 0 :(得分:1)

从异常情况看, selenium-htmlunit-driver (在异常中看到com.gargoylesoftware.htmlunit的结论)无法找到 org.apache.httpcomponents.httpclient v.4.4或更高版本< / strong>(从查找哪个包SSLConnectionSocketFactory得出结论;更具体地说,它需要此lib的4.4或更高版本,因为它无法找到的方法在4.4版中引入,请参阅here)。另外,如果你看一下selenium-htmlunit-driver的dependencies,它看起来好像是使用了4.5.1版本。因此,请在您的依赖项中包含以下内容:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
</dependency>

以便它将此lib与您的JAR打包在一起。当然,请确保您在同一个文件夹中没有其他httpclient-x.x.x.jar

答案 1 :(得分:1)

这是一个传递依赖问题,它意味着你有这个类的jar每个都有该类的版本,这个方法不存在,默认情况下,maven加载它首先得到的类,你可以检查类按 Ctrl + Shift + T ,一旦找到不具有该方法的类,就可以看到该类的多个版本,在pom.xml中,.jar包含该文件的写入排除。