webmagic icon indicating copy to clipboard operation
webmagic copied to clipboard

java.lang.NoSuchFieldError: JAVA_11

Open yuanqingshan opened this issue 5 years ago • 9 comments

HttpClientGenerator这个类中if (SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_11)) { supportedProtocols = new String[] { "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" }; } else { supportedProtocols = new String[] { "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" }; }

JAVA_11没有值啊

yuanqingshan avatar Dec 09 '20 07:12 yuanqingshan

commons-lang3 这个包是什么版本?

sutra avatar Dec 09 '20 10:12 sutra

我也遇到相同问题了,commons-lang3-3.10

bolodanta avatar Dec 23 '20 07:12 bolodanta

我也遇到相同问题了,commons-lang3-3.10

不应该呀,我看是有这个 org.apache.commons.lang3.JavaVersion.JAVA_11

/**
 * Java 11
 *
 * @since 3.8
 */
JAVA_11(11.0f, "11"),

mvn dependency:tree 检查一下看看有没有存在多个版本的 commons-lang3。

sutra avatar Dec 23 '20 07:12 sutra

这个问题有没有解决

enjoqy avatar Jan 13 '21 14:01 enjoqy

这个问题需要你们遇到问题的提供一下 mvn dependency:tree 的输出以便分析到底是怎么回事。

sutra avatar Jan 13 '21 16:01 sutra

这个问题是 commons-lang3包中一个过时的属性导致的,新版本中 JAVA_11这个属性已经不可用

public enum JavaVersion {
    JAVA_0_9(1.5F, "0.9"),
    JAVA_1_1(1.1F, "1.1"),
    JAVA_1_2(1.2F, "1.2"),
    JAVA_1_3(1.3F, "1.3"),
    JAVA_1_4(1.4F, "1.4"),
    JAVA_1_5(1.5F, "1.5"),
    JAVA_1_6(1.6F, "1.6"),
    JAVA_1_7(1.7F, "1.7"),
    JAVA_1_8(1.8F, "1.8"),
    /** @deprecated */
    @Deprecated
    JAVA_1_9(9.0F, "9"),
    JAVA_9(9.0F, "9"),
    JAVA_10(10.0F, "10"),
    JAVA_11(11.0F, "11"),
    JAVA_12(12.0F, "12"),
    JAVA_13(13.0F, "13"),
    JAVA_14(14.0F, "14"),
    JAVA_15(15.0F, "15"),
    JAVA_16(16.0F, "16"),
    JAVA_RECENT(maxVersion(), Float.toString(maxVersion()));

解决办法是重新编译作者的源码,

修改webmagic/webmagic-core/src/main/java/us/codecraft/webmagic/downloader/HttpClientGenerator.java这个类中的buildSSLConnectionSocketFactory()方法,把这个方法的内容全部替换为:

try {
            return new SSLConnectionSocketFactory(createIgnoreVerifySSL(), new String[]{"SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"},
                    null,
                    new DefaultHostnameVerifier()); // 优先绕过安全证书
        } catch (KeyManagementException e) {
            logger.error("ssl connection fail", e);
        } catch (NoSuchAlgorithmException e) {
            logger.error("ssl connection fail", e);
        }
        return SSLConnectionSocketFactory.getSocketFactory();

使用maven重新编译为jar包(会有3个jar),替换本地maven仓库中的jar包即可

这种方法是一劳永逸的,还有一个方法是复制HttpClientGenerator、HttpClientDownloader类到自己的项目中,

然后修改HttpClientGenerator类中buildSSLConnectionSocketFactory()方法,替换全部内容和第一个方法一样,将HttpClientDownloader类中引用的HttpClientGenerator替换为自己刚刚修改的,最后在爬虫的创建启动中把HttpClientDownloader设置进去

Spider.create(new GithubRepoPageProcessor())
                .setDownloader(new HttpClientDownloader())
                .addUrl("https://github.com/code4craft")
                .thread(5)
                .run();

然后在运行就不会报错了,这个错误跟SSL那个错误解决办法基本上是一样的

enjoqy avatar Jan 14 '21 00:01 enjoqy

这个问题需要你们遇到问题的提供一下 mvn dependency:tree 的输出以便分析到底是怎么回事。

已经解决了,三克油

enjoqy avatar Jan 14 '21 01:01 enjoqy

用7.5 也不能解决么

OBJ-feye avatar Aug 23 '22 02:08 OBJ-feye

我遇到了,把commons-lang3更新为3.9 解决。

OBJ-feye avatar Aug 24 '22 03:08 OBJ-feye