12

我正在尝试使用 java 程序连接到 smartsheet api。最初我遇到了站点证书的问题,通过将其添加到 java 密钥库来解决。现在,当我尝试运行代码时,出现以下错误。

Exception in thread "main" java.lang.NoSuchFieldError: INSTANCE
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144)
    at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
    at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
    at com.smartsheet.api.internal.http.DefaultHttpClient.<init>(DefaultHttpClient.java:64)
    at com.smartsheet.api.SmartsheetBuilder.build(SmartsheetBuilder.java:203)
    at SmartsheetConnection.main(SmartsheetConnection.java:13)

这是我的代码(我遵循了他们的文档)。

import com.smartsheet.api.*;
import com.smartsheet.api.models.*;
import com.smartsheet.api.models.enums.*;
import com.smartsheet.api.oauth.*;

public class SmartsheetConnection {
    public static void main(String[] args) throws SmartsheetException {
        // Set the access token.
        Token token = new Token();
        token.setAccessToken("foo");
        Smartsheet smartsheet = new SmartsheetBuilder().setAccessToken(token.getAccessToken()).build();
    }
}

引发错误的行是(第 144 行)

@Deprecated
    public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
        = AllowAllHostnameVerifier.INSTANCE; 

但我不知道该怎么做。我正在使用 maven 来获取依赖项。它与 Apache HttpComponents 的版本有关吗?

这是 pom.xml

    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <warSourceDirectory>WebContent</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.smartsheet</groupId>
            <artifactId>smartsheet-sdk-java</artifactId>
            <version>2.0.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-apache-client</artifactId>
            <version>1.9</version>
        </dependency>
    </dependencies>
4

4 回答 4

11

有关此错误的其他帖子似乎表明它通常是由httpcorejar 的冲突版本引起的。即,httpcore类路径上的旧版本。

有关更多信息,我建议您查看以下帖子:

于 2015-09-26T15:18:06.397 回答
5

我知道我回复得有点晚了,实际上我也在努力解决同样的问题,我通过使用 Maven Shade 插件找到了解决方案。

问题是 JAR 冲突,可能您的项目使用的 HTTPclient 版本与运行 Appliaction 的容器不同。

要解决此问题,请使用以下 Maven Shade 插件,它将 HttpClient 的包名称更改为打包 JAR 的指定名称。这还将重构代码中的所有用法。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
    <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
        </goals>
        <configuration>
            <relocations>
              <relocation>
                <pattern>org.apache.http</pattern>
                <shadedPattern>org.shaded.apache.http</shadedPattern>
              </relocation>
            </relocations>
        </configuration>
    </execution>
</executions>
</plugin>

org.shaded.apache.http上面的示例将使用from更改 HttpClient 包org.apache.http

Maven Shade 还将创建一个 fat/uber jar,这样您的最终包大小会增加,并且将包含您在 POM 中的依赖项中提到的所有类。

如果您不想将所有依赖项 jar 包含在最终 jar 中,则将 Scope 的 Dependency 添加为<scope>provided</scope>.

于 2016-07-02T13:39:01.203 回答
1

这个问题的原因是:org.apache.http.conn.ssl.AllowAllHostnameVerifier 类,在运行时执行,没有字段'INSTANCE'。

我的项目类路径包含两个相同名称的“org.apache.http.conn.ssl.AllowAllHostnameVerifier”类。一个来自我们公司定制的罐子,没有“实例”字段。另一个来自 Maven 中央存储库,其中包含“实例”字段。我的代码有时会运行后一个 jar 的逻辑,有时会运行 fromer jar,这就是我猜测的原因。

我的类路径搜索结果

两个罐子的比较

于 2020-03-29T05:54:50.050 回答
0

我将 intellij 用于 android 和 spring 开发。就我而言,我不小心选择了 Android sdk 作为模块 SDK。

选择 JDK 1.8 并重建项目后为我解决了这个问题

于 2017-09-20T09:44:05.903 回答