Integrasi cepat
Ikuti langkah-langkah berikut untuk mengintegrasikan OSS SDK for Java 1.0 dengan cepat:
Persiapan lingkungan
Anda harus menginstal Java 7 atau yang lebih baru. Jalankan perintah java -version untuk melihat versi Java Anda. Jika Java belum diinstal atau versi Anda lebih lama dari Java 7, unduh Java.
Instal SDK
Pilih metode instalasi berdasarkan lingkungan pengembangan Anda. Untuk memastikan kode contoh berjalan sesuai harapan, gunakan versi terbaru dari OSS SDK for Java 1.0.
Berikut ini menggunakan instalasi OSS SDK for Java 1.0 3.17.4 sebagai contoh.
Tambahkan dependensi Maven (direkomendasikan)
Untuk menggunakan OSS SDK for Java 1.0 dalam proyek Maven, tambahkan dependensi yang sesuai ke file pom.xml.
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>Jika Anda menggunakan Java 9 atau yang lebih baru, tambahkan dependensi JAXB berikut.
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- tidak lebih dari 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>Impor paket JAR ke proyek Eclipse
Unduh OSS SDK for Java 1.0.
Ekstrak paket tersebut.
Salin file aliyun-sdk-oss-3.17.4.jar dan semua file dari folder lib paket yang diekstraksi ke proyek Anda.
Di Eclipse, pilih proyek Anda, klik kanan, dan pilih .
Pilih semua file JAR yang disalin dan impor ke Libraries.
Impor paket JAR ke proyek IntelliJ IDEA
Unduh OSS SDK for Java 1.0.
Ekstrak paket tersebut.
Salin file aliyun-sdk-oss-3.17.4.jar dan semua file JAR dari folder lib paket yang diekstraksi ke proyek Anda.
Di IntelliJ IDEA, pilih proyek Anda, klik kanan, dan pilih .
Pilih semua file JAR yang disalin dan impor ke External Libraries.
Konfigurasi kredensial akses
Konfigurasikan kredensial akses menggunakan Pasangan AccessKey dari Pengguna RAM.
Di Konsol RAM, buat Pengguna RAM yang menggunakan Permanent AccessKey Pair untuk akses. Simpan Pasangan AccessKey dan berikan izin
AliyunOSSFullAccesskepada pengguna.Gunakan Pasangan AccessKey dari Pengguna RAM untuk mengonfigurasi variabel lingkungan.
Linux
Jalankan perintah berikut di antarmuka baris perintah untuk menambahkan pengaturan variabel lingkungan ke file
~/.bashrc:echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bashrcJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
Jalankan perintah berikut di terminal untuk melihat jenis shell default.
echo $SHELLLakukan operasi berikut berdasarkan jenis shell default.
Zsh
Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.zshrcJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file
~/.bash_profile.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profileJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bash_profileJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
Jalankan perintah berikut di CMD.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
Jalankan perintah berikut di PowerShell.
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
Inisialisasi klien
Kode contoh berikut menggunakan endpoint publik wilayah China (Hangzhou) untuk menginisialisasi klien dan mencantumkan bucket di wilayah tersebut untuk verifikasi. Untuk daftar lengkap wilayah dan endpoint, lihat Wilayah dan Endpoint.
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.Bucket;
import java.util.List;
/**
* Contoh integrasi cepat OSS SDK
* Menunjukkan cara menginisialisasi klien OSS dan mencantumkan semua bucket
*/
public class Test {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Setel wilayah OSS dan endpoint
String region = "cn-hangzhou";
String endpoint = "oss-cn-hangzhou.aliyuncs.com";
// Buat penyedia kredensial
DefaultCredentialProvider provider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// Konfigurasikan parameter klien
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Secara eksplisit deklarasikan penggunaan algoritma tanda tangan V4
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Inisialisasi klien OSS
OSS ossClient = OSSClientBuilder.create()
.credentialsProvider(provider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.endpoint(endpoint)
.build();
// Cantumkan semua bucket dari pengguna saat ini
List<Bucket> buckets = ossClient.listBuckets();
System.out.println("Berhasil terhubung ke OSS. Bucket di bawah akun saat ini:");
if (buckets.isEmpty()) {
System.out.println("Tidak ada bucket yang ditemukan di bawah akun saat ini.");
} else {
for (Bucket bucket : buckets) {
System.out.println("- " + bucket.getName());
}
}
// Lepaskan sumber daya
ossClient.shutdown();
System.out.println("Klien OSS telah dimatikan.");
}
}Setelah Anda menjalankan kode, bucket dari akun saat ini di semua wilayah akan ditampilkan:
Berhasil terhubung ke OSS. Bucket di bawah akun saat ini:
- example-bucket
Klien OSS telah dimatikan.Konfigurasi klien
Gunakan kelas ClientConfiguration untuk mengonfigurasi parameter untuk OSSClient, seperti periode timeout, percobaan ulang, dan server proxy.
Gunakan nama domain kustom
Saat Anda menggunakan nama domain default OSS, Anda mungkin menghadapi masalah seperti penolakan akses atau kegagalan pratinjau karena kebijakan keamanan OSS. Dengan mengikat nama domain kustom untuk mengakses OSS, Anda dapat melewati pembatasan akses ini untuk mengaktifkan pratinjau file langsung. Anda juga dapat mengintegrasikan dengan CDN untuk percepatan konten global untuk meningkatkan pengalaman pengguna.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Aktifkan opsi CNAME untuk mendukung akses melalui nama domain kustom
clientBuilderConfiguration.setSupportCname(true);
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
// Gunakan nama domain kustom Anda sebagai endpoint, seperti https://static.example.com
.endpoint("https://static.example.com")
.build();Gunakan endpoint internal
Saat aplikasi Anda diterapkan pada layanan Alibaba Cloud, seperti ECS atau Container Service, gunakan endpoint internal. Ini menyediakan transfer data internal gratis, kecepatan lebih cepat, dan stabilitas jaringan yang lebih baik. Akses internal ideal untuk unggah file besar, pemrosesan data batch, dan skenario akses frekuensi tinggi. Ini secara efektif mengurangi biaya dan meningkatkan performa. Untuk daftar lengkap wilayah dan endpoint internal, lihat Wilayah dan Endpoint.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
// Gunakan endpoint internal. Wilayah China (Hangzhou) digunakan sebagai contoh. Untuk wilayah lain, tentukan endpoint sebenarnya.
.endpoint("oss-cn-hangzhou-internal.aliyuncs.com")
.build();Kontrol batas waktu
Konfigurasikan parameter timeout berdasarkan skenario bisnis Anda. Untuk transfer file besar atau lingkungan jaringan yang tidak stabil, tingkatkan periode timeout. Untuk operasi ringan dengan konkurensi tinggi, atur periode timeout yang lebih pendek untuk melepaskan sumber daya dengan cepat.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur jumlah maksimum koneksi HTTP terbuka yang diizinkan. Defaultnya adalah 1024.
clientBuilderConfiguration.setMaxConnections(1024)
// Atur periode timeout untuk transfer data di lapisan socket, dalam milidetik. Defaultnya adalah 50000 ms.
.setSocketTimeout(50000)
// Atur periode timeout untuk membuat koneksi, dalam milidetik. Defaultnya adalah 50000 ms.
.setConnectionTimeout(50000)
// Atur periode timeout untuk mendapatkan koneksi dari kolam koneksi, dalam milidetik. Secara default, tidak ada batas waktu.
.setConnectionRequestTimeout(60 * 60 * 24 * 1000)
// Atur periode timeout idle untuk koneksi, dalam milidetik. Jika koneksi idle lebih lama dari periode ini, itu akan ditutup. Defaultnya adalah 60000 ms.
.setIdleConnectionTime(60000);
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
.build();Jumlah percobaan ulang kesalahan maksimum
Secara default, klien OSS mencoba ulang permintaan tiga kali untuk meningkatkan tingkat keberhasilan. Di lingkungan dengan konkurensi tinggi atau jaringan tidak stabil, gunakan setMaxErrorRetry untuk meningkatkan jumlah percobaan ulang. Ini dapat secara signifikan meningkatkan ketersediaan layanan. Sesuaikan jumlah percobaan ulang berdasarkan toleransi latensi bisnis Anda dan kualitas lingkungan jaringan Anda.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur jumlah maksimum percobaan ulang untuk permintaan gagal. Sesuaikan ini berdasarkan lingkungan jaringan dan kebutuhan bisnis Anda.
clientBuilderConfiguration.setMaxErrorRetry(5);
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
.build();Kebijakan percobaan ulang
Jangan gunakan setRetryStrategy untuk mengatur kebijakan percobaan ulang kustom karena kebijakan kustom dapat menyebabkan perilaku tak terduga dan memengaruhi stabilitas layanan. Klien OSS menggunakan kebijakan percobaan ulang yang terbukti untuk berbagai jenis permintaan:
Permintaan POST: Secara default, ini tidak dicoba ulang untuk menghindari ketidaksesuaian data dari pengiriman berulang.
Permintaan non-POST: Ini dicoba ulang hingga tiga kali jika kondisi berikut terpenuhi.
ClientExceptionterjadi dengan salah satu kode kesalahan berikut:ConnectionTimeout,SocketTimeout,ConnectionRefused,UnknownHost, atauSocketException.OSSExceptionterjadi dengan kode kesalahan selainInvalidResponse.Kesalahan server sementara terjadi dengan kode status HTTP 500, 502, atau 503.
Server proxy
Lingkungan jaringan perusahaan sering menggunakan server proxy untuk mengakses sumber daya eksternal demi alasan keamanan. Setelah Anda mengonfigurasi server proxy, klien OSS meneruskan semua permintaan HTTP melalui server proxy yang ditentukan untuk akses aman ke OSS.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur user agent, yaitu header User-Agent dalam HTTP. Nilai defaultnya adalah aliyun-sdk-java.
clientBuilderConfiguration.setUserAgent("aliyun-sdk-java");
// Atur alamat IP server proxy. Ganti "" dengan alamat IP server proxy sebenarnya, seperti "196.128.xxx.xxx".
clientBuilderConfiguration.setProxyHost("");
// Atur port server proxy, seperti 8080.
clientBuilderConfiguration.setProxyPort(8080);
// Atur nama pengguna untuk otentikasi server proxy. Ganti "" dengan nama pengguna sebenarnya, seperti "admin".
clientBuilderConfiguration.setProxyUsername("");
// Atur kata sandi untuk otentikasi server proxy. Ganti "" dengan kata sandi yang sesuai.
clientBuilderConfiguration.setProxyPassword("");
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
.build();Protokol HTTP/HTTPS
Gunakan setProtocol untuk mengatur protokol komunikasi antara klien dan server OSS. Defaultnya adalah HTTP. Kami merekomendasikan penggunaan HTTPS di lingkungan produksi untuk memastikan transfer data aman dan mencegah serangan man-in-the-middle serta pelanggaran data.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur protokol komunikasi ke HTTPS untuk memastikan transfer data aman.
clientBuilderConfiguration.setProtocol(Protocol.HTTPS);
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
.build();Versi tanda tangan
Tanda Tangan Versi 1.0 Alibaba Cloud Object Storage Service akan dihapus sesuai jadwal berikut. Kami merekomendasikan Anda tingkatkan ke Signature V4 sesegera mungkin untuk memastikan layanan Anda tidak terpengaruh.
Mulai 1 Maret 2025, pengguna baru tidak akan dapat menggunakan Signature 1.0.
Mulai 1 September 2025, Signature 1.0 tidak akan lagi diperbarui atau dipelihara, dan bucket baru tidak akan dapat menggunakan Signature V1.
Gunakan setSignatureVersion untuk mengonfigurasi versi algoritma tanda tangan. Saat menggunakan Signature V4, Anda harus menggunakan parameter region untuk menentukan ID Wilayah yang benar. Algoritma tanda tangan V4 memberikan keamanan yang lebih tinggi. OSS SDK for Java 1.0 3.15.0 dan versi lebih baru mendukung Signature V4.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Atur versi algoritma tanda tangan ke V4 untuk keamanan yang lebih tinggi.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
// Anda harus menentukan ID wilayah saat menggunakan Signature V4.
.region("cn-hangzhou")
.clientConfiguration(clientBuilderConfiguration)
.build();Gunakan alamat IP
Menggunakan alamat IP sebagai endpoint terutama digunakan untuk akses jaringan internal dan lingkungan jaringan khusus. Setelah Anda membuat koneksi jaringan menggunakan CEN, Express Connect, jalur sewa, atau VPN, gunakan alamat IP untuk mengakses OSS secara langsung. Ini melewati proses resolusi DNS dan meningkatkan efisiensi akses. Untuk konfigurasi rute spesifik, lihat Endpoint Internal dan Blok CIDR VIP untuk OSS.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Aktifkan fitur domain tingkat kedua untuk mendukung akses melalui alamat IP. Fitur ini dinonaktifkan secara default.
// Nilai ini harus disetel untuk OSS Java SDK 1.0 versi 2.1.2 dan sebelumnya.
// Versi 2.1.2 dan lebih baru secara otomatis mendeteksi alamat IP, sehingga nilai ini tidak lagi diperlukan.
clientBuilderConfiguration.setSLDEnabled(true);
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
// Saat mengakses OSS menggunakan alamat IP, gunakan protokol HTTP untuk menghindari masalah verifikasi sertifikat SSL.
.endpoint("http://10.10.10.10")
.build();Pemeriksaan CRC
OSS mengaktifkan pemeriksaan data cyclic redundancy check (CRC) secara default untuk memastikan integritas transfer data. Meskipun ini sedikit meningkatkan waktu transfer, kami merekomendasikan agar Anda tetap mengaktifkannya di lingkungan produksi untuk memastikan konsistensi data. Pertimbangkan untuk menonaktifkan pemeriksaan CRC untuk meningkatkan performa dalam skenario tertentu, seperti streaming pratinjau langsung, data real-time dari perangkat IoT, video pengawasan berkualitas rendah di mana kehilangan data kecil dapat ditoleransi, atau transfer data batch di jaringan internal yang sangat andal. Sebelum menonaktifkan pemeriksaan CRC, Anda harus sepenuhnya menilai risiko ketidaksesuaian data dan melakukan pengujian lengkap.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Nonaktifkan fitur pemeriksaan data CRC. Gunakan ini dengan hati-hati dan sepenuhnya evaluasi risikonya.
clientBuilderConfiguration.setCrcCheckEnabled(false);
OSS ossClient = new OSSClientBuilder()
// Konfigurasi lain...
.clientConfiguration(clientBuilderConfiguration)
.build();Pola singleton
Saat menggunakan OSS SDK for Java 1.0, gunakan pola singleton untuk membuat dan menggunakan instance OSSClient.
OSSClient bersifat thread-safe, yang memungkinkan beberapa thread mengakses instance yang sama. Anda dapat menggunakan pola singleton untuk membuat dan menggunakan kembali instance OSSClient berdasarkan kebutuhan bisnis Anda. Ini menghindari overhead pembuatan dan penghancuran instance secara sering.
Instance OSSClient mempertahankan kolam koneksi secara internal. Ketika instance OSSClient tidak lagi diperlukan, Anda harus memanggil metode shutdown untuk menutupnya dan mencegah kehabisan sumber daya karena terlalu banyak instance yang dibuat.
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;
public class OssClientSingleton {
private OssClientSingleton() {}
// Implementasi singleton dengan kelas statis internal (thread-safe)
private static class SingletonHolder {
private static final OSS INSTANCE = create();
private static OSS create() {
try {
// Wilayah China (Hangzhou) digunakan sebagai contoh. Untuk wilayah lain, tentukan endpoint sebenarnya.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Masukkan wilayah tempat bucket berada. Wilayah China (Hangzhou) digunakan sebagai contoh. Setel wilayah ke cn-hangzhou.
String region = "cn-hangzhou";
ClientBuilderConfiguration config = new ClientBuilderConfiguration();
// Secara eksplisit deklarasikan penggunaan algoritma tanda tangan V4.
config.setSignatureVersion(SignVersion.V4);
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
CredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Bangun klien OSS.
return OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(config)
.region(region)
.build();
} catch (Exception e) {
throw new RuntimeException("Gagal menginisialisasi klien OSS", e);
}
}
}
// Dapatkan instance singleton.
public static OSS getInstance() {
return SingletonHolder.INSTANCE;
}
// Uji operasi PutObject di fungsi utama.
public static void main(String[] args) {
// Dapatkan klien OSS singleton.
OSS ossClient = OssClientSingleton.getInstance();
// Masukkan nama bucket, seperti examplebucket.
String bucketName = "examplebucket";
// Masukkan jalur lengkap objek, tidak termasuk nama bucket, seperti testfolder/exampleobject.txt.
String objectKey = "testfolder/exampleobject.txt";
try {
// Masukkan string.
String content = "Hello OSS";
// Buat objek PutObjectRequest.
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, new ByteArrayInputStream(content.getBytes()));
// Untuk menyetel kelas penyimpanan dan izin akses selama unggah, lihat kode contoh berikut.
ObjectMetadata metadata = new ObjectMetadata();
metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
metadata.setObjectAcl(CannedAccessControlList.Private);
putObjectRequest.setMetadata(metadata);
// Unggah string.
PutObjectResult result = ossClient.putObject(putObjectRequest);
// Cetak hasil unggah.
System.out.println("File berhasil diunggah!");
System.out.println("ETag: " + result.getETag());
System.out.println("ID Permintaan: " + result.getRequestId());
} catch (OSSException oe) {
System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai di OSS, "
+ "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
System.out.println("Kode Kesalahan:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("ID Host:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Tangkap ClientException, yang berarti klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Kesalahan:" + ce.getMessage());
} finally {
// Dalam mode singleton, jangan tutup klien setelah setiap operasi (untuk menggunakan kembali koneksi), karena ini dapat memengaruhi penggunaan berikutnya.
// Saat instance OSSClient tidak lagi diperlukan (misalnya, sebelum aplikasi keluar), panggil metode shutdown sekali untuk melepaskan sumber daya.
// ossClient.shutdown();
}
}
}
Penanganan pengecualian
OSS SDK for Java 1.0 mencakup dua jenis pengecualian: ClientException dan OSSException. Keduanya merupakan turunan dari RuntimeException.
Pengecualian klien (ClientException)
Pengecualian klien terjadi selama pembuatan permintaan, pengiriman, atau transfer data. Skenario umum meliputi:
Koneksi jaringan tidak tersedia, yang mencegah permintaan dikirim ke server.
Terjadi pengecualian IO selama unggah file.
Pengecualian jaringan dasar terjadi, seperti timeout permintaan atau kegagalan verifikasi sertifikat.
ClientException menunjukkan bahwa permintaan tidak berhasil dikirim ke server OSS atau terjadi kesalahan selama pemrosesan di sisi klien. Ini biasanya memerlukan pemeriksaan status koneksi jaringan, konfigurasi klien, atau mekanisme percobaan ulang.
Pengecualian server (OSSException)
Pengecualian server dikembalikan oleh server OSS. Ini berarti permintaan berhasil dikirim dan diterima oleh server tetapi tidak dapat diproses karena suatu alasan. Pengecualian server OSS memiliki karakteristik berikut:
Termasuk kode kesalahan dan pesan kesalahan terperinci untuk identifikasi masalah yang tepat.
Kesalahan umum meliputi SignatureDoesNotMatch, AccessDenied, dan NoSuchKey.
Menangani pengecualian ini berdasarkan kode kesalahan dapat secara signifikan meningkatkan ketahanan program dan pengalaman pengguna.
Kami merekomendasikan Anda menangkap kedua jenis pengecualian ini secara terpisah selama pengembangan untuk lebih akurat mengidentifikasi sumber masalah dan membuat strategi penanganan yang sesuai.
// Buat operasi klien...
try {
// Lakukan operasi OSS, seperti mengunggah file, mengunduh file, atau mencantumkan objek.
// Operasi ini dapat memunculkan pengecualian terkait OSS.
ossClient.putObject(...);
} catch (OSSException oe) {
// Tangkap pengecualian yang dikembalikan oleh server OSS.
// Pengecualian ini dilemparkan ketika permintaan berhasil mencapai server OSS, tetapi server menolak permintaan tersebut.
// Penyebab umum: izin tidak cukup, parameter salah, sumber daya tidak ada, dll.
System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai di OSS, "
+ "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
// Keluarkan informasi kesalahan terperinci untuk lokasi masalah dan debugging.
System.out.println("Pesan Kesalahan: " + oe.getErrorMessage());
System.out.println("Kode Kesalahan: " + oe.getErrorCode());
System.out.println("ID Permintaan: " + oe.getRequestId());
System.out.println("ID Host: " + oe.getHostId());
} catch (ClientException ce) {
// Tangkap pengecualian klien.
// Pengecualian ini dilemparkan ketika klien mengalami masalah internal serius saat mencoba berkomunikasi dengan OSS.
// Penyebab umum: masalah koneksi jaringan, masalah sertifikat SSL, kegagalan resolusi DNS, dll.
System.out.println("Tangkap ClientException, yang berarti klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
// Keluarkan informasi terperinci tentang pengecualian klien.
System.out.println("Pesan Kesalahan: " + ce.getMessage());
} finally {
// Lepaskan sumber daya klien terlepas dari apakah operasi berhasil atau gagal.
// Ini adalah praktik terbaik untuk menghindari kebocoran sumber daya dan kehabisan kolam koneksi.
if (ossClient != null) {
ossClient.shutdown(); // Tutup klien untuk melepaskan koneksi jaringan dan sumber daya lainnya.
}
}Kode contoh
OSS SDK for Java 1.0 menyediakan berbagai kode contoh yang mencakup fitur inti seperti manajemen bucket, operasi file, kontrol akses, dan transfer terenkripsi untuk referensi atau penggunaan langsung Anda. Kode contoh mencakup hal-hal berikut:
File contoh | Isi contoh |
Catatan Implementasi PostObject tidak bergantung pada Java SDK. | |
Konfigurasi kredensial akses
OSS menyediakan beberapa cara untuk menginisialisasi kredensial. Pilih metode inisialisasi berdasarkan kebutuhan otentikasi dan otorisasi Anda.
Gunakan Pasangan AccessKey dari Pengguna RAM
Metode ini digunakan untuk aplikasi yang diterapkan di lingkungan aman dan stabil, tidak rentan terhadap serangan eksternal, memerlukan akses jangka panjang ke OSS, dan tidak dapat memiliki kredensial mereka yang sering diputar. Anda dapat menginisialisasi penyedia kredensial dengan Pasangan AccessKey (AccessKey ID dan AccessKey secret) dari akun Alibaba Cloud atau Pengguna RAM. Metode ini memerlukan Anda secara manual memelihara Pasangan AccessKey, yang meningkatkan risiko keamanan dan kompleksitas pemeliharaan.
Akun Alibaba Cloud memiliki izin penuh atas sumber dayanya. Jika Pasangan AccessKey bocor, itu menimbulkan risiko besar bagi sistem Anda. Kami tidak merekomendasikan menggunakan Pasangan AccessKey dari akun Alibaba Cloud. Sebagai gantinya, gunakan Pasangan AccessKey dari Pengguna RAM dengan izin minimum yang diperlukan.
Untuk membuat Pasangan AccessKey untuk Pengguna RAM, lihat Buat Pasangan AccessKey. AccessKey ID dan AccessKey secret dari Pengguna RAM hanya ditampilkan saat Pasangan AccessKey dibuat. Anda harus menyimpannya segera. Jika Anda lupa, Anda harus membuat Pasangan AccessKey baru untuk menggantinya.
Variabel lingkungan
Gunakan Pasangan AccessKey dari Pengguna RAM untuk mengonfigurasi variabel lingkungan.
Linux
Jalankan perintah berikut di Antarmuka baris perintah untuk menambahkan pengaturan Variabel lingkungan ke file
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bashrcJalankan perintah berikut untuk memverifikasi bahwa Variabel lingkungan telah dikonfigurasi.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
Jalankan perintah berikut di terminal untuk melihat jenis shell default.
echo $SHELLLakukan operasi berikut berdasarkan jenis shell default.
Zsh
Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrcJalankan perintah berikut untuk menerapkan perubahan.
source ~/.zshrcJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
Jalankan perintah berikut untuk menambahkan pengaturan variabel lingkungan ke file
~/.bash_profile.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profileJalankan perintah berikut untuk menerapkan perubahan.
source ~/.bash_profileJalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
Jalankan perintah berikut di CMD.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
Jalankan perintah berikut di PowerShell.
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)Jalankan perintah berikut untuk memverifikasi bahwa variabel lingkungan telah dikonfigurasi.
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
Setelah Anda memodifikasi variabel lingkungan sistem, mulai ulang atau segarkan lingkungan pengembangan Anda, termasuk IDE, antarmuka baris perintah, aplikasi desktop lainnya, dan layanan backend, untuk memastikan variabel lingkungan sistem terbaru dimuat dengan sukses.
Gunakan variabel lingkungan untuk mengirimkan informasi kredensial.
import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.CredentialsProviderFactory; import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider; import com.aliyun.oss.common.comm.SignVersion; public class AkDemoTest { public static void main(String[] args) throws Exception { // Dapatkan kredensial dari variabel lingkungan. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Gunakan credentialsProvider untuk operasi selanjutnya... ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Kredensial statis
Kode sampel berikut menunjukkan cara mengkodekan kredensial akses secara langsung dan secara eksplisit menetapkan Pasangan Kunci Akses untuk digunakan.
Jangan sematkan kredensial akses dalam aplikasi di lingkungan produksi. Metode ini hanya untuk tujuan pengujian.
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
public class AkDemoTest {
public static void main(String[] args) throws Exception {
// Masukkan ID AccessKey dan Rahasia AccessKey dari Pengguna RAM.
String accessKeyId = "yourAccessKeyID";
String accessKeySecret = "yourAccessKeySecret";
// Gunakan metode DefaultCredentialProvider untuk langsung menetapkan ID AccessKey dan Rahasia AccessKey.
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// Gunakan credentialsProvider untuk menginisialisasi klien.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Deklarasikan secara eksplisit penggunaan algoritma tanda tangan V4.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Buat instans OSSClient.
// Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
OSS ossClient = OSSClientBuilder.create()
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region("region")
.build();
ossClient.shutdown();
}
}Gunakan token STS
Metode ini untuk aplikasi yang memerlukan akses sementara ke OSS. Inisialisasi penyedia kredensial dengan kredensial identitas sementara (AccessKey ID, AccessKey secret, dan token keamanan) yang Anda peroleh dari Layanan Token Keamanan (STS). Metode ini mengharuskan Anda secara manual memelihara token STS, yang meningkatkan risiko keamanan dan kompleksitas pemeliharaan. Untuk mengakses OSS sementara beberapa kali, Anda harus secara manual memperbarui token STS.
Untuk memperoleh token STS dengan cepat melalui OpenAPI, lihat AssumeRole - Dapatkan kredensial identitas sementara untuk Peran RAM.
Untuk mendapatkan token STS menggunakan SDK, lihat Gunakan token STS untuk mengakses OSS.
Anda harus menentukan waktu kedaluwarsa saat membuat token STS. Token menjadi tidak valid dan tidak dapat digunakan setelah kedaluwarsa.
Untuk daftar titik akhir layanan STS, lihat Titik Akhir Layanan.
Variabel lingkungan
Gunakan kredensial identitas sementara untuk mengatur variabel lingkungan.
Mac OS/Linux/Unix
PentingCatat bahwa kredensial identitas sementara (AccessKey ID, AccessKey secret, dan token keamanan) yang diperoleh dari layanan STS digunakan di sini, bukan Pasangan Kunci Akses Pengguna RAM.
Catat bahwa AccessKey ID yang diperoleh dari layanan STS dimulai dengan "STS", seperti "STS.****************".
export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>Windows
PentingCatat bahwa kredensial identitas sementara (AccessKey ID, AccessKey secret, dan token keamanan) yang diperoleh dari layanan STS digunakan di sini, bukan Pasangan Kunci Akses (AccessKey ID dan AccessKey secret) Pengguna RAM.
Catat bahwa AccessKey ID yang diperoleh dari layanan STS dimulai dengan "STS", seperti "STS.****************".
set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>Teruskan informasi kredensial melalui variabel lingkungan.
import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.CredentialsProviderFactory; import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider; import com.aliyun.oss.common.comm.SignVersion; public class StsDemoTest { public static void main(String[] args) throws Exception { // Dapatkan kredensial dari variabel lingkungan. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Gunakan credentialsProvider untuk menginisialisasi klien. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Kredensial statis
Tulis kode kredensial secara langsung dalam aplikasi Anda dan atur secara eksplisit kunci akses sementara yang akan digunakan.
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
public class StsDemoTest {
public static void main(String[] args) throws Exception {
// Atur ini ke AccessKey ID sementara, AccessKey secret, dan token keamanan yang diperoleh dari layanan STS, bukan informasi kredensial Pengguna RAM.
// Catat bahwa AccessKey ID yang diperoleh dari layanan STS dimulai dengan "STS", seperti yang ditunjukkan di bawah ini.
String accessKeyId = "STS.****************";
String accessKeySecret = "yourAccessKeySecret";
String stsToken= "yourSecurityToken";
// Gunakan metode DefaultCredentialProvider untuk langsung mengatur AccessKey ID dan AccessKey secret.
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
// Gunakan credentialsProvider untuk menginisialisasi klien.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Buat instans OSSClient.
// Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
OSS ossClient = OSSClientBuilder.create()
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region("region")
.build();
ossClient.shutdown();
}
}Gunakan RAMRoleARN
Metode ini digunakan untuk aplikasi yang memerlukan akses terotorisasi ke OSS, seperti untuk akses lintas akun. Inisialisasi penyedia kredensial dengan menentukan Nama Sumber Daya Alibaba Cloud (ARN) dari peran RAM. Implementasi dasarnya didasarkan pada token STS. Alat Kredensial mendapatkan token STS dari layanan STS dan memanggil operasi API AssumeRole untuk meminta token STS baru sebelum yang saat ini kedaluwarsa. Anda juga dapat memberikan nilai pada parameter policy untuk membatasi peran RAM menjadi set izin yang lebih kecil.
Akun Alibaba Cloud memiliki izin penuh atas sumber dayanya. Jika pasangan AccessKey bocor, hal itu menimbulkan risiko besar bagi sistem Anda. Kami tidak merekomendasikan penggunaan pasangan AccessKey dari akun Alibaba Cloud. Sebagai gantinya, gunakan pasangan AccessKey dari Pengguna RAM dengan izin minimum yang diperlukan.
Untuk membuat pasangan AccessKey untuk Pengguna RAM, lihat Buat pasangan AccessKey. ID AccessKey dan Rahasia AccessKey dari Pengguna RAM hanya ditampilkan saat pasangan AccessKey dibuat. Anda harus menyimpannya segera. Jika Anda lupa, Anda harus membuat pasangan AccessKey baru untuk menggantikan yang lama.
Untuk mendapatkan RAMRoleARN, lihat CreateRole - Buat peran RAM.
Tambahkan dependensi kredensial.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>LATEST</version> </dependency>Konfigurasikan pasangan AccessKey dan RAMRoleARN sebagai kredensial akses.
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; import com.aliyun.oss.common.comm.SignVersion; public class RamRoleArnAkDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // Jenis kredensial akses. Atur ke ram_role_arn. config.setType("ram_role_arn"); // ARN dari peran RAM untuk diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda dapat mengatur RoleArn melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. config.setRoleArn("<RoleArn>"); // Dapatkan ID AccessKey dari variabel lingkungan. config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID")); // Dapatkan Rahasia AccessKey dari variabel lingkungan. config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // Nama sesi peran. Anda dapat mengatur RoleSessionName melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME. config.setRoleName("<RoleSessionName>"); // Tetapkan kebijakan izin yang lebih kecil. Ini opsional. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // Tetapkan periode validitas sesi peran. Ini opsional. config.setRoleSessionExpiration(3600); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // Gunakan credentialsProvider untuk menginisialisasi klien. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("Titik akhir") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("Wilayah") .build(); ossClient.shutdown(); } }
Gunakan ECSRAMRole
Metode ini ditujukan untuk aplikasi yang berjalan pada instance ECS, instance ECI, atau node pekerja dari Container Service for Kubernetes (CSK). Kami merekomendasikan Anda menginisialisasi penyedia kredensial dengan ECSRAMRole. Implementasi dasarnya didasarkan pada token STS. ECSRAMRole memungkinkan Anda menyambungkan peran ke instance ECS, instance ECI, atau node pekerja dari CSK, yang memungkinkan pembaruan otomatis token STS di dalam instans. Metode ini menghilangkan risiko pemeliharaan manual terhadap pasangan Kunci Akses atau token STS karena Anda tidak perlu menyediakannya. Untuk mendapatkan ECSRAMRole, lihat CreateRole - Buat Peran RAM. Untuk menyambungkan peran ke instance ECS, lihat Peran RAM Instans.
Tambahkan dependensi kredensial.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>TERBARU</version> </dependency>Konfigurasikan ECSRAMRole sebagai kredensial akses.
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; import com.aliyun.oss.common.comm.SignVersion; public class EcsRamRoleDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // Jenis kredensial akses. Atur ke ecs_ram_role. config.setType("ecs_ram_role"); // Nama peran RAM yang ditetapkan ke instance ECS. config.setRoleName("<RoleName>"); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // Gunakan credentialsProvider untuk menginisialisasi klien. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("Titik akhir") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("Wilayah") .build(); ossClient.shutdown(); } }
Gunakan OIDCRoleARN
Setelah Anda mengonfigurasi peran RAM node pekerja di Container Service for Kubernetes (CSK), aplikasi dalam pod pada node yang sesuai dapat memperoleh token STS dari peran yang disambungkan melalui Metadata Server, sama seperti aplikasi yang diterapkan pada ECS. Namun, jika aplikasi yang tidak tepercaya diterapkan pada kluster kontainer (misalnya, aplikasi yang dikirimkan oleh pelanggan Anda dengan kode yang tidak terbuka untuk Anda), Anda mungkin tidak ingin mereka memperoleh token STS dari peran RAM instans node pekerja yang disambungkan melalui Metadata Server. Untuk menghindari memengaruhi keamanan sumber daya cloud Anda sambil tetap memungkinkan aplikasi yang tidak tepercaya ini secara aman memperoleh token STS yang diperlukan dan mencapai minimalisasi izin pada tingkat aplikasi, gunakan fitur RAM Roles for Service Accounts (RRSA). Implementasi dasar metode ini didasarkan pada token STS. Kluster kontainer Alibaba Cloud membuat dan memasang file token OpenID Connect (OIDC) akun layanan yang sesuai untuk pod aplikasi yang berbeda dan menyuntikkan informasi konfigurasi terkait ke dalam variabel lingkungan. Alat Credentials memperoleh token STS dari peran yang terikat dengan memanggil operasi API AssumeRoleWithOIDC dari layanan STS menggunakan informasi konfigurasi dari variabel lingkungan. Metode ini menghilangkan risiko pemeliharaan manual pasangan AccessKey atau token STS karena Anda tidak perlu menyediakannya. Untuk informasi lebih lanjut, lihat Konfigurasikan izin RAM untuk ServiceAccount melalui RRSA untuk mencapai isolasi izin pod.
Tambahkan dependensi credentials.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>TERBARU</version> </dependency>Konfigurasikan peran RAM OIDC sebagai kredensial akses.
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; import com.aliyun.oss.common.comm.SignVersion; public class OidcRoleArnDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // Tentukan tipe Credential. Atur ke oidc_role_arn. config.setType("oidc_role_arn"); // ARN dari peran RAM. Anda dapat mengatur RoleArn melalui variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. config.setRoleArn("<RoleArn>"); // ARN dari penyedia OIDC. Anda dapat mengatur OidcProviderArn melalui variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN. config.setOidcProviderArn("<OidcProviderArn>"); // Jalur ke file token OIDC. Anda dapat mengatur OidcTokenFilePath melalui variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE. config.setOidcTokenFilePath("<OidcTokenFilePath>"); // Nama sesi peran. Anda dapat mengatur RoleSessionName melalui variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME. config.setRoleSessionName("<RoleSessionName>"); // Atur kebijakan izin yang lebih kecil. Ini opsional. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"} config.setPolicy("<Policy>"); // Atur waktu kedaluwarsa sesi. config.setRoleSessionExpiration(3600); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // Gunakan credentialsProvider untuk menginisialisasi klien. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Nyatakan secara eksplisit penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instance OSSClient. // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("titik akhir") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("wilayah") .build(); ossClient.shutdown(); } }
Gunakan kredensial dari konteks Function Compute
Metode ini digunakan untuk fungsi aplikasi yang diterapkan di Function Compute. Inisialisasi penyedia kredensial dengan kredensial dari konteks Function Compute. Implementasi dasarnya didasarkan pada token STS. Function Compute memperoleh token STS dengan mengasumsikan peran layanan yang dikonfigurasi untuk fungsi tersebut dan kemudian meneruskan token STS ke aplikasi Anda melalui parameter Kredensial dalam konteks. Token STS ini berlaku selama 36 jam dan tidak dapat diubah. Waktu eksekusi maksimum untuk sebuah fungsi adalah 24 jam, sehingga token STS tidak akan kedaluwarsa selama eksekusi fungsi, dan Anda tidak perlu mempertimbangkan untuk menyegarkannya. Metode ini menghilangkan risiko pemeliharaan manual terhadap pasangan AccessKey atau token STS karena Anda tidak perlu menyediakannya. Untuk memberikan izin kepada Function Compute untuk mengakses OSS, lihat Gunakan peran fungsi untuk memberikan izin Function Compute mengakses layanan Alibaba Cloud lainnya.
Tambahkan dependensi konteks Function Compute.
<!-- https://mvnrepository.com/artifact/com.aliyun.fc.runtime/fc-java-core --> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-core</artifactId> <version>1.4.1</version> </dependency>Inisialisasi penyedia kredensial dengan kredensial dari konteks Function Compute.
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.Credentials; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; public class App implements StreamRequestHandler { @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { // Dapatkan informasi kunci. Sebelum eksekusi, pastikan layanan tempat fungsi berada telah dikonfigurasi dengan informasi peran, dan peran tersebut memiliki izin OSS yang diperlukan. Kami merekomendasikan penggunaan peran AliyunFCDefaultRole. Credentials creds = context.getExecutionCredentials(); // Gunakan kredensial yang diperoleh untuk membuat instance penyedia kredensial. CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken()); // Gunakan credentialsProvider untuk menginisialisasi klien. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instance OSSClient. // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("Titik akhir") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("Wilayah") .build(); ossClient.shutdown(); outputStream.write(new String("selesai").getBytes()); } }
Gunakan CredentialsURI
Metode ini ditujukan untuk aplikasi yang perlu mengambil kredensial Alibaba Cloud dari sistem eksternal untuk manajemen kredensial yang fleksibel dan akses tanpa kunci. Anda dapat menginisialisasi penyedia kredensial dengan CredentialsURI. Implementasi dasarnya didasarkan pada token STS. Alat Credentials memperoleh token STS dari URI yang Anda berikan untuk menginisialisasi klien kredensial. Metode ini menghilangkan risiko pemeliharaan manual Pasangan Kunci Akses atau token STS karena Anda tidak perlu menyediakannya.
Agar alat Credentials dapat mengurai dan menggunakan token STS dengan benar, URI harus mengikuti protokol tanggapan ini:
Kode status tanggapan: 200
Struktur badan tanggapan:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
Tambahkan dependensi kredensial.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>TERBARU</version> </dependency>Konfigurasikan CredentialsURI sebagai kredensial akses.
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; import com.aliyun.oss.common.comm.SignVersion; public class CredentialsUriDemoTest { public static void main(String[] args) { com.aliyun.credentials.models.Config config = new com.aliyun.credentials.models.Config(); // Jenis kredensial akses. Atur ke credentials_uri. config.setType("credentials_uri"); // URI kredensial, yaitu alamat server Anda yang menghasilkan token STS, dalam format http://local_or_remote_uri/. Anda dapat menyetel CredentialsUri melalui variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. config.setCredentialsUri("<CredentialsUri>"); final com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(config); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; // Gunakan credentialsProvider untuk menginisialisasi klien. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instans OSSClient. // Saat instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("Titik akhir") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("Wilayah") .build(); ossClient.shutdown(); } }
Gunakan Pasangan Kunci Akses yang Berotasi Otomatis
Metode ini ditujukan untuk aplikasi yang memerlukan akses jangka panjang ke OSS tetapi diterapkan di lingkungan dengan risiko kebocoran Pasangan Kunci Akses yang memerlukan rotasi manual secara berkala. Inisialisasi penyedia kredensial dengan ClientKey. Implementasi dasarnya didasarkan pada Pasangan Kunci Akses. Saat menggunakan ClientKey, Key Management Service (KMS) dapat secara otomatis dan berkala merotasi Pasangan Kunci Akses Pengguna RAM yang dikelola, mengubah Pasangan Kunci Akses RAM statis menjadi dinamis, sehingga mengurangi risiko kebocoran. Selain rotasi berkala, KMS juga mendukung rotasi segera, yang memungkinkan penggantian cepat Pasangan Kunci Akses jika terjadi kebocoran. Metode ini menghilangkan risiko dan kompleksitas pemeliharaan manual Pasangan Kunci Akses. Untuk mendapatkan ClientKey, lihat Buat titik akses aplikasi.
Tambahkan dependensi klien kredensial.
<!-- https://mvnrepository.com/artifact/com.aliyun/alibabacloud-secretsmanager-client --> <dependency> <groupId>com.aliyun</groupId> <artifactId>alibabacloud-secretsmanager-client</artifactId> <version>1.3.7</version> </dependency> <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.7.0</version> </dependency>Buat file konfigurasi
secretsmanager.properties.# Jenis kredensial akses, tetap sebagai client_key credentials_type=client_key # Kata sandi dekripsi untuk membaca Client Key: mendukung pembacaan dari variabel lingkungan atau file, hanya satu yang perlu disetel client_key_password_from_env_variable=<nama variabel lingkungan kata sandi kunci privat Client Key Anda> client_key_password_from_file_path=<path file kata sandi kunci privat Client Key Anda> # Path ke file kunci privat Client Key client_key_private_key_path=<path file kunci privat Client Key Anda> # Wilayah layanan KMS terkait cache_client_region_id=[{"regionId":"<regionId>"}]Gunakan file konfigurasi untuk menyampaikan informasi kredensial.
import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; import com.aliyun.oss.common.comm.SignVersion; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClient; import com.aliyuncs.kms.secretsmanager.client.SecretCacheClientBuilder; import com.aliyuncs.kms.secretsmanager.client.exception.CacheSecretException; import com.aliyuncs.kms.secretsmanager.client.model.SecretInfo; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; public class ClientKeyDemoTest { public static void main(String[] args) throws CacheSecretException { final SecretCacheClient client = SecretCacheClientBuilder.newClient(); CredentialsProvider credentialsProvider = new CredentialsProvider() { @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { try { SecretInfo secretInfo = client.getSecretInfo("<secretName>"); JSONObject jsonObject = new JSONObject(secretInfo.getSecretValue()); String accessKeyId = jsonObject.getString("AccessKeyId"); String accessKeySecret = jsonObject.getString("AccessKeySecret"); return new DefaultCredentials(accessKeyId, accessKeySecret); } catch (CacheSecretException | JSONException e) { return null; } } }; // Gunakan credentialsProvider untuk menginisialisasi klien. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Nyatakan secara eksplisit penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Buat instance OSSClient. // Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("endpoint") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("region") .build(); ossClient.shutdown(); } }
Gunakan kredensial akses kustom
Jika tidak ada metode konfigurasi kredensial sebelumnya yang memenuhi kebutuhan Anda, sesuaikan penyedia kredensial dengan mengimplementasikan antarmuka CredentialProviders. Perhatikan bahwa jika implementasi dasarnya didasarkan pada token STS, Anda perlu menyediakan dukungan untuk pembaruan kredensial.
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.Credentials;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentials;
import com.aliyun.oss.common.comm.SignVersion;
public class CustomCredentialProviderDemoTest {
public static void main(String[] args) {
CredentialsProvider credentialsProvider = new CredentialsProvider(){
// Inisialisasi variabel
String accessKeyId = null;
// Inisialisasi variabel
String accessKeySecrect = null;
// Inisialisasi variabel
// String token = null;
@Override
public void setCredentials(Credentials credentials) {
}
@Override
public Credentials getCredentials() {
//TODO
//Sesuaikan metode untuk mendapatkan kredensial akses.
// Mengembalikan kredensial jangka panjang: access_key_id, access_key_secrect
return new DefaultCredentials(accessKeyId, accessKeySecrect);
// Mengembalikan kredensial sementara: access_key_id, access_key_secrect, token
// Untuk kredensial sementara, Anda perlu memperbaruinya berdasarkan waktu kedaluwarsa.
// return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
}
};
// Gunakan credentialsProvider untuk menginisialisasi klien.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// Buat instance OSSClient.
// Saat instance OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya.
OSS ossClient = OSSClientBuilder.create()
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region("region")
.build();
ossClient.shutdown();
}
}Gunakan rantai kredensial default
Ketika Anda menginisialisasi klien kredensial tanpa melewati parameter apa pun, alat Kredensial menggunakan rantai kredensial default untuk menginisialisasi klien. Untuk informasi tentang logika membaca kredensial default, lihat Rantai Kredensial Default.
Tambahkan dependensi kredensial.
<!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java --> <dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>TERBARU</version> </dependency>Konfigurasikan Credentials sebagai kredensial akses.
import com.aliyun.credentials.models.CredentialModel; import com.aliyun.oss.*; import com.aliyun.oss.common.auth.Credentials; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.DefaultCredentials; import com.aliyun.oss.common.comm.SignVersion; public class Demo { public static void main(String[] args) { com.aliyun.credentials.Client credentialsClient = new com.aliyun.credentials.Client(); CredentialsProvider credentialsProvider = new CredentialsProvider(){ @Override public void setCredentials(Credentials credentials) { } @Override public Credentials getCredentials() { CredentialModel credential = credentialsClient.getCredential(); return new DefaultCredentials(credential.getAccessKeyId(), credential.getAccessKeySecret(), credential.getSecurityToken()); } }; ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4. clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // Gunakan credentialsProvider untuk menginisialisasi klien. // Buat instans OSSClient. // Ketika instans OSSClient tidak lagi diperlukan, panggil metode shutdown untuk melepaskan sumber daya. OSS ossClient = OSSClientBuilder.create() .endpoint("Titik akhir") .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region("Wilayah") .build(); ossClient.shutdown(); } }
FAQ
Konflik paket
Penyebab
Saat Anda menggunakan OSS SDK for Java 1.0, kesalahan serupa berikut menunjukkan adanya konflik paket di proyek Anda.
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 moreatau
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)Kesalahan terjadi karena OSS SDK for Java 1.0 menggunakan Apache HttpClient 4.4.1, tetapi proyek Anda menggunakan versi yang bertentangan dari Apache HttpClient atau paket JAR commons-httpclient. Jalankan perintah
mvn dependency:treedi direktori proyek Anda untuk melihat paket JAR dan versinya yang digunakan oleh proyek Anda. Seperti yang ditunjukkan pada gambar berikut, proyek menggunakan Apache HttpClient 4.3, yang bertentangan dengan versi standar:
Solusi
Selesaikan konflik paket dengan salah satu dari dua cara berikut:
Gunakan versi yang seragam: Jika proyek Anda menggunakan versi yang bertentangan dengan Apache HttpClient 4.4.1, gunakan versi 4.4.1 dan hapus dependensi pada versi lain dari Apache HttpClient dari file pom.xml. Jika proyek Anda menggunakan commons-httpclient, konflik mungkin juga ada. Hapus dependensi commons-httpclient.
Selesaikan Konflik Dependensi: Jika proyek Anda bergantung pada beberapa pustaka pihak ketiga, dan pustaka tersebut juga bergantung pada versi berbeda dari Apache HttpClient, proyek Anda akan memiliki konflik dependensi. Gunakan tag exclusion untuk menyelesaikannya. Untuk informasi lebih lanjut, lihat Panduan Maven.
OSS SDK for Java 1.0 bergantung pada versi paket berikut. Metode penyelesaian konfliknya mirip dengan HttpClient.

Paket hilang
Penyebab
Saat Anda menggunakan OSS SDK for Java 1.0, kesalahan serupa berikut dapat terjadi karena proyek Anda mungkin kehilangan paket yang diperlukan untuk mengompilasi atau menjalankan OSS SDK for Java 1.0.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/auth/Credentials 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:76) Caused by: java.lang.ClassNotFoundException: org.apache.http.auth.Credentials 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 moreatau
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/protocol/HttpContext 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:76) Caused by: java.lang.ClassNotFoundException: org.apache.http.protocol.HttpContext 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 moreatau
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder at com.aliyun.oss.internal.ResponseParsers.getXmlRootElement(ResponseParsers.java:645) at … … at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:471) at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:465) at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:82) Caused by: java.lang.ClassNotFoundException: org.jdom.input.SAXBuilder 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) ... 11 moreOSS SDK for Java 1.0 bergantung pada paket-paket berikut:
aliyun-sdk-oss-2.2.1.jar
hamcrest-core-1.1.jar
jdom-1.1.jar
commons-codec-1.9.jar
httpclient-4.4.1.jar
commons-logging-1.2.jar
httpcore-4.4.1.jar
log4j-1.2.15.jar
Di antaranya, log4j-1.2.15.jar adalah dependensi opsional. Tambahkan paket ini hanya jika Anda memerlukan fungsionalitas logging. Paket lainnya wajib.
Solusi
Tambahkan paket yang menjadi dependensi OSS SDK for Java 1.0 ke proyek Anda. Anda dapat menggunakan salah satu metode berikut:
Proyek Eclipse: Untuk informasi lebih lanjut, lihat Instal SDK.
Proyek Ant: Tempatkan paket yang menjadi dependensi OSS SDK for Java 1.0 ke dalam direktori lib proyek Anda.
Kompilasi langsung: Gunakan perintah
-classpathatau-cpuntuk menentukan jalur paket yang menjadi dependensi OSS SDK for Java 1.0, atau tempatkan paket-paket ini di classpath.
Timeout koneksi
Penyebab
Saat Anda menjalankan program OSS SDK for Java 1.0, kesalahan serupa berikut mungkin dilaporkan:
com.aliyun.oss.ClientException: SocketException at com.aliyun.oss.common.utils.ExceptionFactory.createNetworkException(ExceptionFactory.java:71) at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:116) at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121) at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67) at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92) at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140) at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111) at com.aliyun.oss.internal.OSSBucketOperation.getBucketInfo(OSSBucketOperation.java:1152) at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1220) at com.aliyun.oss.OSSClient.getBucketInfo(OSSClient.java:1214) at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:94) Caused by: org.apache.http.conn.HttpHostConnectException: Connect to oss-test.oss-cn-hangzhou-internal.aliyuncs.com:80 [oss-test.oss-cn-hangzhou-internal.aliyuncs.com/10.84.135.99] failed: Connection timed out: connect at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113) ... 9 moreSolusi
Anda dapat menggunakan alat ossutil untuk dengan cepat menemukan penyebab kesalahan dan menyelesaikan masalah.
Kesalahan SignatureDoesNotMatch
Penyebab 1: Informasi Pasangan AccessKey tidak cocok
AccessKey ID dan AccessKey secret tidak cocok. Untuk informasi tentang cara mendapatkan AccessKey ID dan AccessKey secret, lihat Buat Pasangan AccessKey.
Penyebab 2: Penggunaan URL yang Ditandatangani tidak benar
Berikut ini adalah contoh salah dalam menggunakan URL yang ditandatangani:
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, object); request.setExpiration( new Date(new Date().getTime() + 3600 * 1000)); request.addUserMetadata("author"); URL url = ossClient.generatePresignedUrl(request); Map<String, String> header = new HashMap<String, String>(); header.put("author"); ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);Jika parameter Method tidak disetel, metode GET digunakan secara default. Namun, contoh sebelumnya adalah permintaan PutObject. Oleh karena itu, parameter Method harus disetel dan diatur ke PUT.
Saat Anda mengirim permintaan PutObject,metadata kustom dalam header permintaan harus diawali dengan
x-oss-meta-. Dalam contoh sebelumnya, metadata kustom harus diubah menjadix-oss-meta-author.Solusi:
Tentukan parameter Method dan modifikasi awalan header:
request.addUserMetadata("author"); request.setMethod(HttpMethod.PUT); URL url = ossClient.generatePresignedUrl(request); Map<String, String> header = new HashMap<String, String>(); header.put("x-oss-meta-" + "author"); ossClient.putObject(url, new ByteArrayInputStream("Hello OSS".getBytes()), -1, header);Penyebab 3: Masalah kompatibilitas versi HttpClient
Versi OSS SDK sebelum 3.7.0 digunakan, dan HttpClient 4.5.9 atau lebih baru diperkenalkan dalam proyek.
Nama file yang diunggah berisi karakter
+, dan HttpClient 4.5.9 tidak melakukan URL-encoding pada karakter+. Ini menyebabkan tanda tangan yang dihitung oleh klien dan server tidak konsisten.

Solusi:
Tingkatkan OSS SDK ke versi 3.11.1 atau lebih baru agar kompatibel dengan HttpClient 4.5.9.
Hapus dependensi HttpClient yang berlebihan. Saat Anda memperkenalkan OSS SDK, dependensi HttpClient secara otomatis diperkenalkan. Jika pustaka pihak ketiga juga memperkenalkan HttpClient, lihat solusi untuk Konflik Paket.
Penyebab 4: Masalah kompatibilitas set karakter HttpClient
HttpClient 4.5.10 tidak mendukung karakter di luar standar ISO-8859-1 di header. Namun, versi HttpClient lebih baru dari 4.5.10 diperkenalkan dalam proyek, dan header permintaan berisi karakter di luar standar ISO-8859-1, seperti karakter Cina dalam metadata kustom yang dimulai dengan
x-oss-meta-.
Solusi:
Lihat solusi untuk Konflik Paket untuk menghapus versi HttpClient yang bertentangan.
Lewatkan hanya karakter yang sesuai dengan standar ISO-8859-1 di header permintaan.
"Gagal mengurai hasil tanggapan" pengecualian

Penyebab
Perangkat lunak khusus tertentu di sisi Klien memotong Permintaan HTTP, atau entri rute jaringan publik membajak Permintaan HTTP.
Anda menggunakan OSS SDK for Java 1.0 pada Java 9 atau yang lebih baru, dan Anda belum menambahkan dependensi terkait JAXB ke file pom.xml.
Solusi
Beralihlah ke Permintaan HTTPS.
Tambahkan dependensi terkait JAXB. Untuk prosedurnya, lihat Instal SDK.
org.apache.http.NoHttpResponseException: Server target gagal merespons
Penyebab
Saat Anda menjalankan program OSS SDK for Java 1.0, kesalahan serupa berikut dilaporkan:

Menggunakan koneksi yang kedaluwarsa menyebabkan kesalahan di atas. Kesalahan ini hanya terjadi pada versi Java SDK sebelum 2.1.2.
Solusi
Tingkatkan OSS SDK for Java 1.0 ke versi 2.1.2 atau lebih baru.
Banyak instance org.apache.http.impl.conn.PoolingHttpClientConnectionManager ada di JVM
Penyebab
ossClient tidak ditutup dengan benar.
Solusi
Tutup ossClient setelah selesai dieksekusi, atau gunakan pola singleton.
Panggilan OSS SDK for Java 1.0 tidak responsif
Penyebab
Panggilan OSS SDK for Java 1.0 tidak responsif. Dengan menjalankan perintah
jstack -l piduntuk melihat stack, masalah terletak pada posisi berikut:"main" prio=6 tid=0x000000000291e000 nid=0xc40 waiting on condition [0x0000000002dae000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000007d85697f8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:138) at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:306) at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:64) at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:192) at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:185) at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:107) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:276) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:263) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:113) at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:123) at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:68) at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:94) at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:146) at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113) at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:229) at com.aliyun.oss.OSSClient.getObject(OSSClient.java:629) at com.aliyun.oss.OSSClient.getObject(OSSClient.java:617) at samples.HelloOSS.main(HelloOSS.java:49)Penyebabnya adalah kebocoran koneksi di kolam koneksi, kemungkinan karena ossObject tidak ditutup dengan benar setelah digunakan.
Solusi
Periksa program Anda untuk memastikan tidak ada kebocoran koneksi. Gunakan metode berikut untuk menutup koneksi dengan benar:
// Baca file. OSSObject ossObject = ossClient.getObject(bucketName, objectName); // Operasi OSS // Tutup ossObject. ossObject.close();Untuk langkah-langkah pemecahan masalah yang lebih rinci, lihat Pemecahan Masalah OSS SDK for Java 1.0 yang Tidak Responsif.
Koneksi ditutup
Penyebab
Jika Anda mengalami kesalahan serupa berikut saat menggunakan ossClient.getObject:
Exception in thread "main" org.apache.http.ConnectionClosedException: Premature end of Content-Length delimited message body (expected: 11990526; received: 202880) at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:180) at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:200) at org.apache.http.impl.io.ContentLengthInputStream.close(ContentLengthInputStream.java:103) at org.apache.http.impl.execchain.ResponseEntityProxy.streamClosed(ResponseEntityProxy.java:128) at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:228) at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:174) at java.io.FilterInputStream.close(FilterInputStream.java:181) at java.io.FilterInputStream.close(FilterInputStream.java:181) at com.aliyun.oss.event.ProgressInputStream.close(ProgressInputStream.java:147) at java.io.FilterInputStream.close(FilterInputStream.java:181) at samples.HelloOSS.main(HelloOSS.java:39)Penyebabnya adalah interval antara dua pembacaan data melebihi 1 menit. OSS menutup koneksi yang idle selama lebih dari 1 menit.
Solusi
Jika Anda hanya membaca sebagian data setiap kali dan waktu pemrosesan data tidak tetap, gunakan unduhan rentang untuk menghindari penutupan koneksi selama pembacaan data. Koneksi ditutup secara otomatis setelah unduhan rentang selesai. Untuk informasi lebih lanjut, lihat Unduhan Rentang (Java SDK).
Kebocoran memori
Penyebab
Program yang memanggil OSS SDK for Java 1.0 mengalami kebocoran memori setelah berjalan selama beberapa waktu (dari beberapa jam hingga beberapa hari, tergantung volume bisnis). Kami merekomendasikan menggunakan Eclipse Memory Analyzer (MAT) untuk menganalisis penggunaan memori. Untuk informasi lebih lanjut, lihat Analisis File Dump Heap dengan MAT.
Jika hasil analisisnya mirip dengan gambar di bawah ini (PoolingHttpClientConnectionManager menempati 96% dari memori), penyebabnya adalah bahwa
new OSSClientmungkin telah dieksekusi beberapa kali dalam program, tetapiossClient.shutdowntidak dipanggil, yang mengakibatkan kebocoran memori.
Solusi
Setelah operasi
new OSSClientselesai, panggil metodeshutdownuntuk menutupnya. Pastikannew OSSClientdanossClient.shutdowndigunakan berpasangan.
InterruptedException dilaporkan saat memanggil ossClient.shutdown
Penyebab
Versi OSS SDK for Java 1.0 sebelum 2.3.0 melaporkan pengecualian berikut saat memanggil
ossClient.shutdown:java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.aliyun.oss.common.comm.IdleConnectionReaper.run(IdleConnectionReaper:76)Penyebabnya adalah bahwa thread backend ossClient IdleConnectionReaper secara berkala menutup koneksi idle. Jika ossClient.shutdown dipanggil saat IdleConnectionReaper sedang Sleep, pengecualian di atas dilaporkan.
Solusi
Gunakan kode berikut untuk mengabaikan pengecualian:
try { ossClient.shutdown(); } catch(Exception e) { }
"SDK.ServerUnreachable : Titik akhir atau uri yang ditentukan tidak valid" pengecualian

Penyebab
Klien mengirim terlalu banyak permintaan konkurensi ke STS.
Koneksi jaringan ke server mengalami waktu habis.
Versi STS SDK dan SDK core yang digunakan bukan versi terbaru.
Solusi
Klien mengirim terlalu banyak permintaan konkurensi ke STS, dan ECS instance klien atau komputer lokal tidak dapat menangani konkurensi. Kurangi konkurensi OSS.
Koneksi jaringan dari pengguna ke server mengalami waktu habis. Tangkap paket untuk memverifikasi hal ini.
Perbarui STS SDK dan SDK core ke versi terbaru.
NoSuchKey

Penyebab
File sumber tidak ada.
Solusi
Untuk informasi lebih lanjut, lihat 404 Error.
SocketException

Penyebab
Socket mungkin gagal selama fase inisialisasi, menyebabkan permintaan gagal sebelum mencapai OSS.
Solusi
Kami menyarankan Anda memeriksa aspek-aspek berikut:
Apakah fluktuasi jaringan terjadi saat masalah muncul.
Apakah jumlah koneksi soket pada Host telah mencapai batas maksimal?
Pastikan apakah jumlah koneksi melebihi pengaturan maxconnection di SDK saat masalah terjadi. Jika jumlah koneksi melebihi pengaturan maxconnection, pengecualian socket juga akan terjadi.
Jika tidak ada masalah dengan hal-hal di atas, kami sarankan Anda menggunakan tcpdump atau Wireshark untuk menangkap paket, lalu menganalisis paket data setelah masalah berulang.
Pemicu callback OSS PostObject tidak dipicu
Pemicu callback OSS PostObject tidak dipicu, tetapi pemicu callback yang sama bekerja pada PutObject. Secara umum, jika format JSON tidak benar atau callback gagal, pesan yang sesuai akan dikembalikan. Dalam kasus ini, Anda perlu menguji efek callback Put dan Post secara terpisah:

Penyebab
Saat mengirim permintaan, parameter callback berada di bawah parameter file.

Solusi
Atur ulang posisi parameter callback dan file.

Pada titik ini, hasil pengujian menunjukkan bahwa server bisnis berhasil menangkap permintaan.

Connection pool shut down
Caused by: java.lang.IllegalStateException: Connection pool shut down
at org.apache.http.util.Asserts.check(Asserts.java:34)
at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:184)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:251)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:175)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:124)
at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:133)
... 8 morePenyebab
Anda terus mengirim permintaan melalui ossClient setelah memanggil metode
ossClient.shutdown().Solusi
Periksa logika pemanggilan Anda untuk memastikan bahwa setelah Anda memanggil metode
ossClient.shutdown(), Anda tidak lagi mengirim permintaan melalui ossClient.
Kesalahan "Request has expired" terjadi untuk permintaan yang dihasilkan oleh generatePresignedUrl dari Java SDK
Penyebab
Overflow integer menyebabkan masalah timestamp terkait dengan masalah tahun 2038.
Permintaan unggah dimulai setelah waktu kedaluwarsa yang ditetapkan untuk URL.
Solusi
Jika itu adalah overflow integer, kami menyarankan agar durasi kedaluwarsa di Java SDK tidak melebihi tahun 2038.
Jika permintaan unggah dimulai setelah waktu kedaluwarsa yang ditetapkan untuk URL, atur waktu kedaluwarsa yang wajar untuk memastikan bahwa waktu kedaluwarsa lebih lambat dari waktu Anda memulai permintaan.
"Invalid Response" atau "Implementasi JAXB-API tidak ditemukan di module path atau classpath" kesalahan
Penyebab
Anda menggunakan Java 9 atau yang lebih baru dan belum menambahkan dependensi JAXB.
Solusi
Untuk informasi tentang cara menambahkan dependensi JAXB, lihat Instal SDK.
Apakah OSSClient dalam OSS SDK for Java 1.0 thread-safe?
Ya, itu thread-safe. OSSClient bersifat thread-safe, yang memungkinkan beberapa thread mengakses instance yang sama. Anda dapat menggunakan kembali instance OSSClient yang sama atau membuat beberapa instance OSSClient untuk digunakan secara terpisah, berdasarkan kebutuhan bisnis Anda.
Instance OSSClient mempertahankan kolam koneksi secara internal. Saat instance OSSClient tidak lagi diperlukan, Anda harus memanggil metode shutdown untuk menutupnya dan menghindari kehabisan sumber daya karena terlalu banyak instance OSSClient yang dibuat.
Kesalahan "AccessDenied Hierarchical namespace is disabled" dilaporkan
Penyebab
Hierarchical namespace tidak diaktifkan sebelum Anda memanggil operasi API CreateDirectory, Rename, atau DeleteDirectory.
Solusi
Aktifkan hierarchical namespace saat Anda membuat bucket. Untuk prosedur spesifik, lihat Buat Bucket.
Jaringan klien normal, tetapi kesalahan "Connection reset" dilaporkan selama akses HTTP. Bagaimana cara menanganinya?
Beberapa operator di wilayah tertentu mungkin membajak nama domain OSS. Kami merekomendasikan agar Anda mengonfigurasi protokol sebagai HTTPS melalui endpoint. Untuk informasi lebih lanjut, lihat Konfigurasikan Klien.
Java 17 Tidak dapat memanggil "java.lang.reflect.Method.invoke(Object, Object[])" karena "com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass" adalah null
Penyebab
JAXB ditandai sebagai deprecated di Java 9 dan dihapus di Java 11.
Solusi
Tambahkan dependensi berikut:
<dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.messaging.saaj</groupId> <artifactId>saaj-impl</artifactId> <version>1.5.1</version> </dependency>
Bagaimana cara mengonfigurasi pencatatan log internal untuk Java SDK?
Java SDK menggunakan framework Apache Commons Logging (JCL) untuk pencatatan log. JCL dapat menggunakan beberapa framework implementasi logging. Untuk informasi lebih lanjut, lihat JCL-Konfigurasi. Yang paling umum adalah JCL over log4j atau JCL over SLF4j. Metode implementasinya adalah sebagai berikut:
JCL over log4j: Anda perlu memperkenalkan dependensi log4j (log4j 2.x memiliki beberapa framework implementasi untuk dipilih, defaultnya adalah log4j-api+log4j-core) dan mengonfigurasinya sesuai dengan metode konfigurasi log4j. Untuk proses spesifik, lihat APACHE LOG4J-API Separation.
JCL over slf4j: Anda perlu memperkenalkan dependensi jcl-over-slf4j dan slf4j (slf4j juga memiliki beberapa framework implementasi untuk dipilih, seperti slf4j-api+logback-classic) dan mengonfigurasinya sesuai dengan metode konfigurasi slf4j. Untuk proses spesifik, lihat SJF4J-Bridging Legacy APIs.
Apache Log4j mendefinisikan berbagai tingkat log, termasuk OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, dan ALL.
Aktifkan atau nonaktifkan log SDK dengan mengonfigurasi properti log4j:
