code4craft / webmagic

A scalable web crawler framework for Java.
http://webmagic.io/
Apache License 2.0
11.38k stars 4.18k forks source link

java.lang.NoSuchFieldError: JAVA_11 #970

Open yuanqingshan opened 3 years ago

yuanqingshan commented 3 years ago

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没有值啊

sutra commented 3 years ago

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

bolodanta commented 3 years ago

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

sutra commented 3 years ago

我也遇到相同问题了,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。

enjoqy commented 3 years ago

这个问题有没有解决

sutra commented 3 years ago

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

enjoqy commented 3 years ago

这个问题是 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 commented 3 years ago

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

已经解决了,三克油

OBJ-feye commented 2 years ago

用7.5 也不能解决么

OBJ-feye commented 2 years ago

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