Deskripsi masalah
Object Storage Service (OSS) SDK untuk Java mengembalikan NoClassDefFoundError atau NoSuchFieldError, yang menunjukkan kemungkinan adanya konflik paket dalam proyek. Kode berikut menunjukkan detail dari NoClassDefFoundError:
Exception in thread "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)
at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:77)
Caused by: 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 moreKode berikut menunjukkan detail dari NoSuchFieldError:
Exception in thread "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)
at OSSManagerImpl.main(OSSManagerImpl.java:63)Penyebab
NoClassDefFoundError terjadi ketika mesin virtual Java tidak dapat menemukan kelas tertentu pada waktu proses yang tersedia pada waktu kompilasi. Sebagai contoh, mesin virtual Java mengembalikan NoClassDefFoundError jika metode atau anggota statis dari suatu kelas tidak tersedia pada waktu proses.
Solusi
Kesalahan ini menunjukkan adanya masalah dalam kode. Periksa apakah paket JAR dalam kode Anda menyebabkan konflik. Gunakan salah satu metode berikut untuk menyelesaikan konflik paket JAR:
Gunakan versi yang sama dari Apache HttpClient. Jalankan
mvn dependency:treedi direktori proyek untuk memeriksa paket JAR dan versi yang digunakan oleh proyek. Sebagai contoh, kode berikut menunjukkan bahwa proyek Anda menggunakan Apache HttpClient 4.3:
Jika OSS SDK untuk Java menggunakan Apache HttpClient 4.4.1 dan proyek Anda menggunakan versi lain dari Apache HttpClient, gunakan Apache HttpClient 4.4.1 untuk proyek Anda dan hapus dependensi Apache HttpClient untuk versi lain dari file
pom.xml.CatatanVersi Apache HttpClient yang disediakan dalam topik ini hanya untuk tujuan ilustrasi. Sesuaikan kode Anda berdasarkan versi Apache HttpClient yang Anda gunakan.
Jika proyek Anda menggunakan Commons HttpClient, konflik juga dapat terjadi. Untuk menyelesaikan konflik tersebut, hapus Commons HttpClient.
Selesaikan konflik dependensi. Jika proyek Anda bergantung pada beberapa paket pihak ketiga dan paket-paket tersebut bergantung pada versi berbeda dari Apache HttpClient, konflik dependensi dapat terjadi pada proyek Anda. Untuk menyelesaikan konflik tersebut, gunakan pengecualian dependensi. Untuk informasi lebih lanjut, lihat Panduan Maven.
Ruang lingkup aplikasi
OSS