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>
このエラーに関する他の投稿は、通常、httpcore
jarのバージョンの競合が原因であると示唆しているようです。つまり、クラスパス上のhttpcore
の古いバージョン。
詳細については、次の投稿をチェックアウトすることをお勧めします。
私は少し遅れて返信していることを知っていますが、実際には私も同じ問題に苦労しており、Maven Shadeプラグインを使用して解決策を見つけました。
問題は、おそらくあなたのプロジェクトが異なるバージョンのHTTPclientを使用しているJARの競合であり、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
からorg.Apache.http
へのHttpClientパッケージを変更します
Maven Shadeはfat/uber jarも作成するため、最終的なパッケージサイズが増加し、POMの依存関係で言及したすべてのクラスが含まれます。
最終的なjarにすべての依存関係jarを含めたくない場合は、依存関係のスコープを<scope>provided</scope>
として追加します。
AndroidとSpring開発の両方にintellijを使用していました。私の場合、誤ってAndroid sdkをモジュールSDKとして選択しました。
JDK 1.8を選択してプロジェクトを再構築すると、問題が解決しました
この問題の理由は次のとおりです。ランタイムで実行されるorg.Apache.http.conn.ssl.AllowAllHostnameVerifierクラスには、フィールド「INSTANCE」がありません。
プロジェクトのクラスパスに、「org.Apache.http.conn.ssl.AllowAllHostnameVerifier」という2つの同じ名前のクラスが含まれています。 1つは、「INSTANCE」フィールドのない、弊社がカスタマイズしたjarファイルからのものです。もう1つは、フィールド「INSTANCE」を持つMavenセントラルリポジトリからのものです。私のコードは、後者のjarのロジックを実行することもあれば、fromer jarを実行することもあります。これが、私が推測した理由です。