web-dev-qa-db-ja.com

APIを使用しようとしたときにエラーが発生しました。 Java.lang.NoSuchFieldError:INSTANCE

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>
10
mahacoder

このエラーに関する他の投稿は、通常、httpcore jarのバージョンの競合が原因であると示唆しているようです。つまり、クラスパス上のhttpcoreの古いバージョン。

詳細については、次の投稿をチェックアウトすることをお勧めします。

10
Kim Brandl

私は少し遅れて返信していることを知っていますが、実際には私も同じ問題に苦労しており、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>として追加します。

3
Animesh Sinha

AndroidとSpring開発の両方にintellijを使用していました。私の場合、誤ってAndroid sdkをモジュールSDKとして選択しました。

JDK 1.8を選択してプロジェクトを再構築すると、問題が解決しました

0
user2829759

この問題の理由は次のとおりです。ランタイムで実行されるorg.Apache.http.conn.ssl.AllowAllHostnameVerifierクラスには、フィールド「INSTANCE」がありません。

プロジェクトのクラスパスに、「org.Apache.http.conn.ssl.AllowAllHostnameVerifier」という2つの同じ名前のクラスが含まれています。 1つは、「INSTANCE」フィールドのない、弊社がカスタマイズしたjarファイルからのものです。もう1つは、フィールド「INSTANCE」を持つMavenセントラルリポジトリからのものです。私のコードは、後者のjarのロジックを実行することもあれば、fromer jarを実行することもあります。これが、私が推測した理由です。

私のクラスパス検索結果

2つのjarの比較

0
xuedisong