全部产品
Search
文档中心

Object Storage Service:Bagaimana cara menangani NoClassDefFoundError atau NoSuchFieldError di OSS SDK untuk Java?

更新时间:Jun 26, 2025

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 more

Kode 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:tree di 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.

      Catatan

      Versi 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