Scala uber jar中的NoSuchMethodError异常
它们在我的Scala uber jar中的NoSuchMethodError异常,scala,maven,selenium,ssl,apache-spark,Scala,Maven,Selenium,Ssl,Apache Spark,它们在我的pom.xml文件中。当我将maven项目中的驱动程序作为Scala应用程序运行时,它运行良好。但是当我创建一个带有依赖项的jar,并试图通过spark submit spark-submit --class package.signature.Driver --master local[*] /path/to/my/jar-with-dependencies.jar 我得到以下例外 线程“main”java.lang.NoSuchMethodError中出现异常: SSLConne
pom.xml
文件中。当我将maven项目中的驱动程序作为Scala应用程序运行时,它运行良好。但是当我创建一个带有依赖项的jar,并试图通过spark submit
spark-submit --class package.signature.Driver --master local[*] /path/to/my/jar-with-dependencies.jar
我得到以下例外
线程“main”java.lang.NoSuchMethodError中出现异常:
SSLConnectionSocketFactory.(Ljavax/net/ssl/SSLContext;[Ljava/lang/String;[Ljava/lang/String;Ljavax/net/ssl/HostnameVerifier;)V
在
com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.(HtmlUnitSSLConnectionSocketFactory.java:125)
在
com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.buildsslssocketfactory(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
。但这不起作用。从异常中,似乎selenium htmlunit驱动程序(从异常中查看com.gargoylesoftware.htmlunit
得出的结论)找不到org.apache.httpcomponents.httpclient v.4.4或更高版本的(从查找哪个包中得出结论;更具体地说,它需要这个库的版本4.4或更高版本,因为它找不到的方法是在版本4.4中引入的,请参阅)。此外,如果您查看selenium htmlunit驱动程序的版本,它看起来像是在使用版本4.5.1。因此,请将以下内容包括在您的依赖项中:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
org.apache.httpcomponents
httpclient
4.5.1
因此,它将这个库与您的JAR打包在一起。当然,还要确保在同一个文件夹中没有另一个httpclient-x.x.JAR
。这是一个可传递的依赖性问题,这意味着您有JAR,其中每个JAR都有该类的版本,其中该方法不存在,默认情况下maven加载该类首先,你可以按Ctrl+Shift+T来检查这个类,你可以看到这个类的多个版本,一旦你在pom.xml
中找到了这个.jar
中没有这个方法的类,它包含了这个文件的写排除功能。我尝试了你上面提到的解决方案。它不起作用。我们就这样做了重新包含多个httpclient。我尝试在pom依赖项中使用excludes
排除所有其他httpclient
版本。这也不起作用。在项目中的Eclipse中,按Ctrl+Shift+t
where?,例如,要搜索某个文件,我们使用Ctrl+Shift+R,同样使用Ctrl+Shift+t搜索所有源文件rs