HtmlUnit Android:NoSuchFieldError:类型为Lorg / apache / http / conn / ssl / AllowAllHostnameVerifier的INSTANCE静态字段不存在。

5
我正在尝试在Android上运行HtmlUnit。 我认为这个答案曾经在老的库中能够正常工作,但现在不再适用。其他相关于此问题的线程并不涉及在安卓上使用Kotlin或者已经过时。
请考虑以下代码: https://github.com/JimClermonts/HtmlUnit-for-Android
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    doAsync {
        val webClient = WebClient()
        var page: HtmlPage = webClient.getPage<HtmlPage>("http://www.google.com")
        val searchBox = page.getElementByName<HtmlInput>("q")
        searchBox.valueAttribute = "htmlunit"

        val googleSearchSubmitButton: HtmlSubmitInput = page.getElementByName("btnG") // sometimes it's "btnK"
        page = googleSearchSubmitButton.click()

        val resultStatsDiv: HtmlDivision = page.getFirstByXPath("//div[@id='resultStats']")

        System.out.println(resultStatsDiv.asText()) // About 309,000 results

        webClient.close()
    }
}

以下是我的项目依赖关系:

dependencies {
    implementation group: 'commons-io', name: 'commons-io', version: '2.6'
//    implementation group: 'commons-logging', name: 'commons-logging', version: '1.2'
    implementation group: 'commons-net', name: 'commons-net', version: '3.6'
    implementation group: 'net.sourceforge.htmlunit', name: 'htmlunit-core-js', version: '2.34.0'
    implementation group: 'net.sourceforge.htmlunit', name: 'htmlunit-cssparser', version: '1.3.0'
    implementation group: 'net.sourceforge.htmlunit', name: 'neko-htmlunit', version: '2.34.0'
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
    implementation group: 'org.apache.commons', name: 'commons-text', version: '1.6'
    implementation group: 'org.eclipse.jetty.websocket', name: 'websocket-client', version: '9.4.15.v20190215'
    implementation group: 'xalan', name: 'xalan', version: '2.7.2'

    //Project Transitive Dependencies
    implementation('org.apache.httpcomponents:httpmime:4.5.7') {
        exclude module: 'httpclient'
    }
    implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
//    implementation group: 'commons-codec', name: 'commons-codec', version: '1.11'
//    implementation('org.apache.httpcomponents:httpmime:4.5.7') {
//        exclude module: 'httpclient'
//    }
//    implementation 'org.apache.httpcomponents:httpclient-android:4.3.5'
////    implementation group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.4.11'
//    implementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '9.4.15.v20190215'
//    implementation group: 'org.eclipse.jetty', name: 'jetty-http', version: '9.4.15.v20190215'
//    implementation group: 'org.eclipse.jetty', name: 'jetty-io', version: '9.4.15.v20190215'
//    implementation group: 'org.eclipse.jetty', name: 'jetty-util', version: '9.4.15.v20190215'
//    implementation group: 'org.eclipse.jetty', name: 'jetty-xml', version: '9.4.15.v20190215'
//    implementation group: 'org.eclipse.jetty.websocket', name: 'websocket-api', version: '9.4.15.v20190215'
//    implementation group: 'org.eclipse.jetty.websocket', name: 'websocket-common', version: '9.4.15.v20190215'
//    implementation group: 'xalan', name: 'serializer', version: '2.7.2'
//    implementation group: 'xerces', name: 'xercesImpl', version: '2.12.0'
//    implementation group: 'xml-apis', name: 'xml-apis', version: '1.4.01'


    implementation "org.jetbrains.anko:anko-commons:0.10.1"
    implementation "org.jetbrains.anko:anko-design:0.10.1"
    implementation "org.jetbrains.anko:anko-coroutines:0.10.1"
}

Android清单文件:

<uses-permission android:name="android.permission.INTERNET" />

错误信息:
W/System.err: java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/conn/ssl/AllowAllHostnameVerifier; in class Lorg/apache/http/conn/ssl/AllowAllHostnameVerifier; or its superclasses (declaration of 'org.apache.http.conn.ssl.AllowAllHostnameVerifier' appears in /system/framework/framework.jar:classes3.dex)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:149)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.buildSSLSocketFactory(HtmlUnitSSLConnectionSocketFactory.java:89)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.HttpWebConnection.configureHttpsScheme(HttpWebConnection.java:626)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.HttpWebConnection.createHttpClient(HttpWebConnection.java:558)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.HttpWebConnection.getHttpClientBuilder(HttpWebConnection.java:519)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:171)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1402)
2019-04-12 09:17:06.712 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1321)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:394)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:315)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:466)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:448)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at eu.theappfactory.myapplication.MainActivity$onCreate$1.invoke(MainActivity.kt:20)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at eu.theappfactory.myapplication.MainActivity$onCreate$1.invoke(MainActivity.kt:12)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at org.jetbrains.anko.AsyncKt$doAsync$1.invoke(Async.kt:140)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at org.jetbrains.anko.AsyncKt$doAsync$1.invoke(Unknown Source:0)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at org.jetbrains.anko.AsyncKt$sam$Callable$761a5578.call(Unknown Source:2)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
2019-04-12 09:17:06.713 5110-5140/eu.theappfactory.myapplication W/System.err:     at java.lang.Thread.run(Thread.java:764)

你的代码进行了混淆保护吗? - rds
可能是重复的问题:在Android SDK 23中使用Apache HttpClient。NoSuchMethod - Martin Zeitler
4个回答

0

在Github上有一个名为“htmlunit android”的Android修改版或更好地说是正常工作的版本。 你面临的问题是由于http客户端,这已经是Android框架的一部分,但被Google修改过了。 对于ssl操作,htmlunit库需要完整的apache http库。 这是来自的消息。 经过一天的调试,我发现htmlunit webrequest需要一些缺失的类才能完成调用。 使用这个库: https://github.com/null-dev/HtmlUnit-Android


0

从版本2.52.0开始,依赖于java.awt的类的数量现在大大降低了。如果您需要解决其他问题,请在Github上打开一个问题,我会尝试找到解决剩余依赖项的方法。


0

这个错误的原因是HtmlUnit(使用HttpClient)和安卓JDK内部集成的HttpClient版本之间存在类版本冲突。

现在有一个特殊的HtmlUnit发行版可用于 https://github.com/HtmlUnit/htmlunit-android 解决此问题。

请尝试并报告任何问题。


-2

我不知道为什么你要指定传递依赖项,除非你想以某种方式进行配置。

我将它们注释掉后,应用程序编译并部署到设备上了。


确保项目编译和部署成功,但不会崩溃。 - Jim Clermonts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接