我正在尝试使用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>
答案 0 :(得分:9)
关于此错误的其他帖子似乎表明它通常是由httpcore
jar的冲突版本引起的。即类路径上的httpcore
的旧版本。
有关详细信息,我建议您查看以下帖子:
答案 1 :(得分:3)
我知道我回复的时间实际上我也遇到了同样的问题,我通过使用Maven Shade插件找到了解决方案。
问题是JAR冲突,可能是您的项目正在使用不同版本的HTTPclient,然后是运行Appliaction的容器。
要解决此问题,请使用Below 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
的{{1}}的HttpClient软件包
Maven Shade还会创建一个胖/超级jar,这样你的最终包大小就会增加,并且你将拥有你在POM中的Dependency中提到的所有类。
如果您不想在最终jar中包含所有依赖关系jar,请将依赖关系的Scope添加为org.apache.http
。
答案 2 :(得分:1)
此问题的原因是: 在运行时中执行的org.apache.http.conn.ssl.AllowAllHostnameVerifier类没有字段“ INSTANCE”。
我的项目类路径包含两个相同的名称类“ org.apache.http.conn.ssl.AllowAllHostnameVerifier”。 一个来自我们公司定制的罐子,没有“ INSTANCE”字段。 另一个来自maven中央存储库,其字段为“ INSTANCE”。 我的代码有时运行后一个jar的逻辑,有时运行fromer jar的逻辑,这就是我猜到的原因。
答案 3 :(得分:0)
我正在使用intellij进行android和spring开发。 就我而言,我不小心选择了Android sdk作为模块SDK。
选择JDK 1.8并重建项目后,为我解决了问题