問題の説明
Object Storage Service (OSS) SDK for Javaは、NoClassDefFoundErrorまたはNoSuchFieldErrorを返し、プロジェクトにパッケージの競合が存在する可能性があることを示します。 次のコードは、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の詳細を示しています。
例外: 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