すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:OSS SDK for JavaでNoClassDefFoundErrorまたはNoSuchFieldErrorを処理するにはどうすればよいですか?

最終更新日:Dec 22, 2023

問題の説明

Object Storage Service (OSS) SDK for Javaは、NoClassDefFoundErrorまたはNoSuchFieldErrorを返し、プロジェクトにパッケージの競合が存在する可能性があることを示します。 次のコードは、NoClassDefFoundErrorの詳細を示しています。

スレッド "main" java.lang.NoClassDefFoundErrorの
例外: org/apache/http/ssl/TrustStrategy
    at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
    at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
    com.aliyun.oss.de mo.HelloOSS.main(HelloOSS.java:77) で
原因: java.lang.ClassNotFoundException: org.apache.http.ssl.TrustStrategy
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 3もっと 

次のコードは、NoSuchFieldErrorの詳細を示しています。

スレッド "main" java.lang.NoSuchFieldErrorの
例外: INSTANCE
 at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
 at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
 at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
 at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:82)
 at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:95)
 at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:104)
 at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:62)
 at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:572)
 at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:174)
 at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:158)
 at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
 at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:125)
 at com.aliyun.oss.common.comm.DefaultServiceClient.createHttpClientConnectionManager(DefaultServiceClient.java:237)
 at com.aliyun.oss.common.comm.DefaultServiceClient.<init>(DefaultServiceClient.java:78)
 at com.aliyun.oss.OSSClient.<init>(OSSClient.java:268)
 at com.aliyun.oss.OSSClient.<init>(OSSClient.java:193)
 at OSSManagerImpl.upload(OSSManagerImpl.java:42)
 OSSManagerImpl.main(OSSManagerImpl.java:63) 

原因

NoClassDefFoundErrorは、Java仮想マシンが実行時にコンパイル時に使用可能な特定のクラスを見つけることができないために発生します。 たとえば、Java仮想マシンは、必須メソッドまたはクラスの静的メンバーが実行時に使用できない場合、NoClassDefFoundErrorを返します。

解決策

エラーは、コードの問題が存在することを示します。 コード内のJARパッケージが競合を引き起こすかどうかを確認します。 次のいずれかの方法を使用して、JARパッケージの競合を解決できます。

  • 同じバージョンのApache HttpClientを使用します。 プロジェクトディレクトリでmvn dependency:treeを実行し、JARパッケージとプロジェクトが使用するバージョンを確認します。 たとえば、次のコードは、プロジェクトがApache HttpClient 4.3を使用することを示しています。

    • OSS SDK for JavaがApache HttpClient 4.4.1を使用し、プロジェクトがApache HttpClient 4.4.1と競合するApache HttpClientを使用している場合、プロジェクトにApache HttpClient 4.4.1を使用し、他のバージョンのApache HttpClientの依存関係をpom.xmlファイルから削除します。

      説明

      このトピックで提供されるApache HttpClientのバージョンは、例示のみを目的としています。 使用するApache HttpClientのバージョンに基づいてコードを調整します。

    • プロジェクトでCommons HttpClientを使用すると、競合が発生する可能性もあります。 これらの競合を解決するには、Commons HttpClientを削除します。

  • 依存関係にある競合を削除します。 プロジェクトが複数のサードパーティパッケージに依存しており、パッケージが異なるバージョンのApache HttpClientに依存している場合、プロジェクトで依存関係が競合する可能性があります。 競合を解決するには、依存関係の除外を使用します。 詳しくは、「Maven ガイド」をご参照ください。

適用範囲

  • OSS