首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试使用API时出错。java.lang.NoSuchFieldError:实例

尝试使用API时出错。java.lang.NoSuchFieldError:实例
EN

Stack Overflow用户
提问于 2015-09-26 13:02:48
回答 4查看 31.4K关注 0票数 12

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

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
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行)

代码语言:javascript
运行
复制
@Deprecated
    public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
        = AllowAllHostnameVerifier.INSTANCE; 

但我不确定该怎么理解它。我正在使用maven来获取依赖项。这与Apache HttpComponents的版本有关吗?

这是pom.xml

代码语言:javascript
运行
复制
    <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>
EN

回答 4

Stack Overflow用户

发布于 2015-09-26 23:18:06

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

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

票数 11
EN

Stack Overflow用户

发布于 2016-07-02 21:39:01

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

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

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

代码语言:javascript
运行
复制
<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.apache.http中的org.shaded.apache.http更改HttpClient包

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

如果您不想在最终的jar中包含所有的依赖项jar,那么将依赖项的作用域添加为<scope>provided</scope>

票数 5
EN

Stack Overflow用户

发布于 2020-03-29 13:54:50

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

我的项目类路径包含两个同名的"org.apache.http.conn.ssl.AllowAllHostnameVerifier".类一个来自我们公司定制的jar,它没有字段'INSTANCE‘。另一个来自maven中央存储库,其中有字段'INSTANCE‘。我的代码有时运行后一个jar的逻辑,有时运行fromer的逻辑,这就是我猜测的原因。

my classpath search result

the comparison of the two jar

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32793830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档