Tüm Ürünler
Search
Belge Merkezi

Object Storage Service:OSS Java SDK V1

Son Güncelleme:Oct 01, 2026

Github | OSS SDK for Java API | mvnrepository

Hızlı entegrasyon

OSS Java SDK V1'i entegre etmek için:

image

Ortamı hazırlama

Java 7 veya sonraki bir sürümü yükleyin. Java sürümünüzü görüntülemek için java -version komutunu çalıştırabilirsiniz. Java yüklü değilse veya sürümünüz Java 7'den önceki bir sürümse Java'yı indirin.

SDK'yı yükleme

Ortamınıza göre bir kurulum yöntemi seçin. OSS Java SDK V1'in en son sürümünü kullanın.

Aşağıdaki örneklerde OSS Java SDK V1 3.17.4 sürümü kullanılmıştır.

Maven bağımlılığı ekleme (önerilen)

OSS Java SDK V1'i bir Maven projesinde kullanmak için ilgili bağımlılığı pom.xml dosyasına ekleyin.

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.18.4</version>
</dependency>

Java 9 veya sonraki bir sürüm kullanıyorsanız aşağıdaki JAXB ile ilgili bağımlılıkları ekleyin.

<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>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

JAR paketlerini Eclipse projesine aktarma

  1. OSS Java SDK V1'i indirin.

  2. Paketi sıkıştırmadan çıkarın.

  3. Sıkıştırması açılan paketteki aliyun-sdk-oss-3.17.4.jar dosyasını ve lib klasöründeki tüm dosyaları projenize kopyalayın.

  4. Eclipse'te projenize sağ tıklayın ve Properties > Java Build Path > Add JARs seçeneklerini belirleyin.

  5. Kopyalanan tüm JAR dosyalarını seçin ve Libraries bölümüne aktarın.

JAR paketlerini IntelliJ IDEA projesine aktarma

  1. OSS Java SDK V1'i indirin.

  2. Paketi sıkıştırmadan çıkarın.

  3. Sıkıştırması açılan paketteki aliyun-sdk-oss-3.17.4.jar dosyasını ve lib klasöründeki tüm JAR dosyalarını projenize kopyalayın.

  4. IntelliJ IDEA'da projenizi seçin ve File > Project Structure > Modules > Dependencies > + > JARs or directories seçeneklerini belirleyin.

  5. Kopyalanan tüm JAR dosyalarını seçin ve External Libraries bölümüne aktarın.

Erişim kimlik bilgilerini yapılandırma

Bir RAM kullanıcısının AccessKey çiftiyle erişim kimlik bilgilerini yapılandırın.

  1. RAM konsolunda Permanent AccessKey Pair içeren bir RAM kullanıcısı oluşturun. AccessKey çiftini kaydedin ve kullanıcıya AliyunOSSFullAccess iznini verin.

  2. RAM kullanıcısının AccessKey çiftini kullanarak ortam değişkenlerini yapılandırın.

    Linux

    1. Komut satırı arabiriminde aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını ~/.bashrc dosyasına ekleyin.

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.

      source ~/.bashrc
    3. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. Varsayılan kabuk türünü görüntülemek için terminalde aşağıdaki komutu çalıştırın.

      echo $SHELL
    2. Varsayılan kabuk türüne göre aşağıdaki işlemleri gerçekleştirin.

      Zsh

      1. Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını ~/.zshrc dosyasına ekleyin.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.

        source ~/.zshrc
      3. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını ~/.bash_profile dosyasına ekleyin.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.

        source ~/.bash_profile
      3. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. CMD'de aşağıdaki komutları çalıştırın.

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. PowerShell'de aşağıdaki komutları çalıştırın.

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)

İstemciyi başlatma

Aşağıdaki örnek kod, Çin (Hangzhou) bölgesinin genel uç noktasını kullanarak istemciyi başlatır. Ardından kurulumu doğrulamak için hesaba ait tüm paketleri listeler. Bölgelerin ve uç noktaların tam listesi için bkz. Bölgeler ve uç noktalar.

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;

/**
 * OSS SDK quick integration example
 * Shows how to initialize an OSS client and list all buckets
 */
public class Test {

    public static void main(String[] args) {
        // Obtain access credentials from environment variables
        String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");

        // Set the OSS region and endpoint
        String region = "cn-hangzhou";
        String endpoint = "oss-cn-hangzhou.aliyuncs.com";

        // Create a credential provider
        DefaultCredentialProvider provider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

        // Configure client parameters
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Explicitly declare the use of the V4 signature algorithm
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

        // Initialize the OSS client
        OSS ossClient = OSSClientBuilder.create()
                .credentialsProvider(provider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .endpoint(endpoint)
                .build();

        // List all buckets of the current user
        List<Bucket> buckets = ossClient.listBuckets();
        System.out.println("Successfully connected to OSS. Buckets under the current account:");

        if (buckets.isEmpty()) {
            System.out.println("No buckets found under the current account.");
        } else {
            for (Bucket bucket : buckets) {
                System.out.println("- " + bucket.getName());
            }
        }

        // Release resources
        ossClient.shutdown();
        System.out.println("OSS client has been shut down.");
    }
}

Kodu çalıştırdıktan sonra mevcut hesabın tüm bölgelerdeki paketleri görüntülenir:

Successfully connected to OSS. Buckets under the current account:
- example-bucket
OSS client has been shut down.

İstemci yapılandırması

ClientConfiguration sınıfını kullanarak zaman aşımı süreleri, yeniden deneme sayıları ve proxy sunucuları gibi OSSClient parametrelerini yapılandırın.

Desteklenen istemci yapılandırmalarını görüntülemek için tıklayın

Yöntem

Açıklama

ClientConfiguration.setMaxConnections

İzin verilen maksimum açık HTTP bağlantısı sayısını ayarlar. Varsayılan değer 1024'tür.

ClientConfiguration.setSocketTimeout

Soket katmanındaki veri aktarımları için milisaniye cinsinden zaman aşımı süresini ayarlar. Varsayılan değer 50000 ms'dir.

ClientConfiguration.setConnectionTimeout

Bağlantı kurmak için milisaniye cinsinden zaman aşımı süresini ayarlar. Varsayılan değer 50000 ms'dir.

ClientConfiguration.setConnectionRequestTimeout

Bağlantı havuzundan bağlantı almak için milisaniye cinsinden zaman aşımı süresini ayarlar. Varsayılan olarak zaman aşımı ayarlanmamıştır.

ClientConfiguration.setIdleConnectionTime

Bir bağlantı için milisaniye cinsinden boşta kalma zaman aşımı süresini ayarlar. Bir bağlantı bu süreden daha uzun süre boşta kalırsa kapatılır. Varsayılan değer 60000 ms'dir.

ClientConfiguration.setSupportCname

Uç nokta olarak CNAME kayıtlarının desteklenip desteklenmeyeceğini belirtir. CNAME varsayılan olarak desteklenir.

ClientConfiguration.setCrcCheckEnabled

CRC kontrollerinin etkinleştirilip etkinleştirilmeyeceğini belirtir. CRC kontrolleri varsayılan olarak etkindir.

ClientConfiguration.setSLDEnabled

İkinci düzey alan adı üzerinden erişimin etkinleştirilip etkinleştirilmeyeceğini belirtir. Bu özellik varsayılan olarak devre dışıdır.

ClientConfiguration.setProtocol

OSS'ye bağlanmak için kullanılan protokol (HTTP veya HTTPS). Varsayılan protokol HTTP'dir.

ClientConfiguration.setUserAgent

HTTP'deki User-Agent başlığı olan kullanıcı aracısı. Varsayılan değer aliyun-sdk-java'dir.

ClientConfiguration.setProxyHost

Proxy sunucusunun ana bilgisayar adresi.

ClientConfiguration.setProxyPort

Proxy sunucusunun bağlantı noktası.

ClientConfiguration.setProxyUsername

Proxy sunucusu kimlik doğrulaması için kullanıcı adı.

ClientConfiguration.setProxyPassword

Proxy sunucusu kimlik doğrulaması için parola.

ClientConfiguration.setRedirectEnable

HTTP yönlendirmesinin etkinleştirilip etkinleştirilmeyeceğini belirtir.

ClientConfiguration.setVerifySSLEnable

SSL sertifikası doğrulamasının etkinleştirilip etkinleştirilmeyeceğini belirtir.

ClientConfiguration.setMaxErrorRetry

Başarısız bir istek için maksimum yeniden deneme sayısı. Varsayılan değer 3'tür.

ClientConfiguration.setRetryStrategy

Özel bir yeniden deneme ilkesi ayarlar. Bu parametrenin ayarlanması önerilmez.

Özel alan adı kullanma

Varsayılan OSS alan adı, OSS güvenlik ilkeleri nedeniyle erişim reddine veya önizleme hatalarına neden olabilir. Özel bir alan adı bağlama bu kısıtlamaları bypass eder, doğrudan dosya önizlemelerini etkinleştirir ve küresel içerik hızlandırma için CDN entegrasyonunu destekler.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Enable the CNAME option to support access through a custom domain name
clientBuilderConfiguration.setSupportCname(true);

OSS ossClient = new OSSClientBuilder()
    // Other configurations...      
    .clientConfiguration(clientBuilderConfiguration)
    // Use your custom domain name as the endpoint, such as https://static.example.com
    .endpoint("https://static.example.com")
    .build();

Dahili uç nokta kullanma

Uygulamanız ECS veya Container Service gibi Alibaba Cloud hizmetlerinde çalışırken ücretsiz dahili veri aktarımı, daha yüksek hızlar ve daha fazla kararlılık sağlamak için dahili bir uç nokta kullanın. Dahili erişim, büyük dosya yüklemeleri, toplu iş veri işleme ve yüksek frekanslı erişim senaryoları için uygundur. Daha fazla bilgi için bkz. Bölgeler ve uç noktalar.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();

OSS ossClient = new OSSClientBuilder()
    // Other configurations...      
    .clientConfiguration(clientBuilderConfiguration)
    // Use an internal endpoint. The China (Hangzhou) region is used as an example. For other regions, specify the actual endpoint.
    .endpoint("oss-cn-hangzhou-internal.aliyuncs.com")
    .build();

Zaman aşımı kontrolü

Kullanım durumunuz için zaman aşımı parametrelerini ayarlayın. Büyük dosya aktarımları veya kararsız ağlar için zaman aşımlarını artırın. Kaynakları hızlı bir şekilde serbest bırakmak amacıyla yüksek eşzamanlılık gerektiren hafif işlemler için daha kısa zaman aşımları kullanın.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the maximum number of allowed open HTTP connections. The default is 1024.
clientBuilderConfiguration.setMaxConnections(1024)
    // Set the timeout period for data transfers at the socket layer, in milliseconds. The default is 50000 ms.
    .setSocketTimeout(50000)
    // Set the timeout period for establishing a connection, in milliseconds. The default is 50000 ms.
    .setConnectionTimeout(50000)
    // Set the timeout period for obtaining a connection from the connection pool, in milliseconds. By default, there is no timeout limit.
    .setConnectionRequestTimeout(60 * 60 * 24 * 1000)
    // Set the idle timeout period for a connection, in milliseconds. If a connection is idle for longer than this period, it is closed. The default is 60000 ms.
    .setIdleConnectionTime(60000);

OSS ossClient = new OSSClientBuilder()
    // Other configurations...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Maksimum hata yeniden denemesi

OSS istemcisi, başarısız istekleri varsayılan olarak üç kez yeniden dener. Yüksek eşzamanlılık veya kararsız ağ ortamlarında yeniden deneme sayısını artırmak için setMaxErrorRetry kullanın. Gecikme gereksinimlerinize ve ağ kalitenize göre ayarlayın.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the maximum number of retries for a failed request. Adjust this based on your network environment and business needs.
clientBuilderConfiguration.setMaxErrorRetry(5);

OSS ossClient = new OSSClientBuilder()
    // Other configurations...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Yeniden deneme ilkesi

Özel bir yeniden deneme ilkesi ayarlamak için setRetryStrategy kullanmayın. Özel ilkeler beklenmeyen davranışlara neden olabilir. OSS istemcisi, farklı istek türleri için kanıtlanmış yeniden deneme ilkelerini kullanır:

  • POST istekleri: Tekrarlanan gönderimlerden kaynaklanabilecek veri tutarsızlığını önlemek için bunlar varsayılan olarak yeniden denenmez.

  • POST dışı istekler: Aşağıdaki koşullar karşılandığında bunlar en fazla üç kez yeniden denenir.

    • Aşağıdaki hata kodlarından biriyle bir ClientException özel durumu oluşur: ConnectionTimeout, SocketTimeout, ConnectionRefused, UnknownHost veya SocketException.

    • InvalidResponse dışındaki bir hata koduyla bir OSSException özel durumu oluşur.

    • 500, 502 veya 503 HTTP durum koduyla geçici bir sunucu tarafı hatası oluşur.

Proxy sunucusu

Kurumsal ağlar genellikle trafiği proxy sunucuları üzerinden yönlendirir. Bir proxy yapılandırdıktan sonra OSS istemcisi tüm HTTP isteklerini bunun üzerinden iletir.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();

// Set the user agent, which is the User-Agent header in HTTP. The default value is aliyun-sdk-java.
clientBuilderConfiguration.setUserAgent("aliyun-sdk-java");
// Set the IP address of the proxy server. Replace "" with the actual IP address of the proxy server, such as "196.128.xxx.xxx".
clientBuilderConfiguration.setProxyHost("");
// Set the port of the proxy server, such as 8080.
clientBuilderConfiguration.setProxyPort(8080);
// Set the username for proxy server authentication. Replace "" with the actual username, such as "admin".
clientBuilderConfiguration.setProxyUsername("");
// Set the password for proxy server authentication. Replace "" with the corresponding password.
clientBuilderConfiguration.setProxyPassword("");

OSS ossClient = new OSSClientBuilder()
    // Other configurations...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

HTTP/HTTPS protokolü

İletişim protokolünü ayarlamak için setProtocol kullanın. Varsayılan HTTP'dir. Güvenli veri aktarımı sağlamak ve ara adam saldırılarını önlemek için üretim ortamında HTTPS kullanın.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the communication protocol to HTTPS to ensure secure data transfer.
clientBuilderConfiguration.setProtocol(Protocol.HTTPS);

OSS ossClient = new OSSClientBuilder()
    // Other configurations...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

İmza sürümü

Önemli

Alibaba Cloud Object Storage Service Signature V1 aşağıdaki programa göre kullanımdan kaldırılacaktır. Hizmetlerinizin etkilenmemesini sağlamak için mümkün olan en kısa sürede Signature V4'e yükseltmenizi öneririz.

  • 1 Mart 2025 tarihinden itibaren yeni kullanıcılar Signature V1'i kullanamayacaktır.

  • 1 Eylül 2025 tarihinden itibaren Signature V1 güncellenmeyecek veya bakımı yapılmayacak ve yeni paketler Signature V1'i kullanamayacaktır.

İmza algoritması sürümünü yapılandırmak için setSignatureVersion kullanabilirsiniz. Signature V4 kullanırken doğru bölge kimliğini belirtmek için region parametresini kullanmanız gerekir. V4 imza algoritması daha yüksek güvenlik sağlar. OSS Java SDK V1 3.15.0 ve sonraki sürümler Signature V4'ü destekler.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Set the signature algorithm version to V4 for higher security.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);

OSS ossClient = new OSSClientBuilder()
    // Other configurations...
    // You must specify the region ID when using Signature V4.
    .region("cn-hangzhou")
    .clientConfiguration(clientBuilderConfiguration)
    .build();

IP adresi kullanma

Dahili ağ erişimi ve özel ağ ortamları için uç nokta olarak bir IP adresi kullanın. CEN, Express Connect, kiralık hat veya VPN üzerinden bağlantı kurduktan sonra doğrudan IP erişimi DNS çözümlemesini bypass eder ve verimliliği artırır. Yönlendirme yapılandırmaları için bkz. OSS için dahili uç noktalar ve VIP CIDR blokları.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Enable access to OSS through a second-level domain. This feature is disabled by default.
// This value must be set for OSS Java SDK V1 2.1.2 and earlier.
// Versions 2.1.2 and later automatically detect the IP address, so this value is no longer required.
clientBuilderConfiguration.setSLDEnabled(true);

OSS ossClient = new OSSClientBuilder()
    // Other configurations...
    .clientConfiguration(clientBuilderConfiguration)
    // When you access OSS using an IP address, use the HTTP protocol to avoid SSL certificate verification issues.
    .endpoint("http://10.10.10.10")
    .build();

CRC kontrolü

Aktarım bütünlüğünü sağlamak için CRC veri kontrolleri varsayılan olarak etkindir. Üretim ortamında CRC'yi etkin tutun. Canlı önizleme akışları, IoT cihazı verileri, düşük kaliteli gözetim videoları veya son derece güvenilir dahili ağlarda toplu aktarımlar gibi küçük veri kaybının tolere edilebileceği senaryolar dışında bunu devre dışı bırakmayı düşünmeyin. Devre dışı bırakmadan önce veri tutarlılığı risklerini tamamen değerlendirin.

ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Disable the CRC data check feature. Use this with caution and fully assess the risks.
clientBuilderConfiguration.setCrcCheckEnabled(false); 

OSS ossClient = new OSSClientBuilder()
    // Other configurations...
    .clientConfiguration(clientBuilderConfiguration)
    .build();

Singleton desen

OSSClient örneklerini oluşturmak ve yönetmek için singleton desenini kullanın.

  • OSSClient iş parçacığı açısından güvenlidir. Sık oluşturma ve yok etme yükünü önlemek için tek bir OSSClient örneğini yeniden kullanmak amacıyla singleton desenini kullanın.

  • OSSClient dahili bir bağlantı havuzu korur. Artık gerekli olmadığında kaynakları serbest bırakmak için shutdown yöntemini çağırın.

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() {}

    // Implement singleton with a static inner class (thread-safe)
    private static class SingletonHolder {
        private static final OSS INSTANCE = create();

        private static OSS create() {
            try {
                // The China (Hangzhou) region is used as an example. For other regions, specify the actual endpoint.
                String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
                // Enter the region where the bucket is located. The China (Hangzhou) region is used as an example. Set the region to cn-hangzhou.
                String region = "cn-hangzhou";

                ClientBuilderConfiguration config = new ClientBuilderConfiguration();
                // Explicitly declare the use of the V4 signature algorithm.
                config.setSignatureVersion(SignVersion.V4);

                // Obtain access credentials from environment variables. Before running this sample code, make sure the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
                CredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

                // Build the OSS client.
                return OSSClientBuilder.create()
                        .endpoint(endpoint)
                        .credentialsProvider(credentialsProvider)
                        .clientConfiguration(config)
                        .region(region)
                        .build();
            } catch (Exception e) {
                throw new RuntimeException("Failed to initialize OSS client", e);
            }
        }
    }

    // Get the singleton instance.
    public static OSS getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // Test the PutObject operation in the main function.
    public static void main(String[] args) {
        // Get the singleton OSS client.
        OSS ossClient = OssClientSingleton.getInstance();

        // Enter the bucket name, such as examplebucket.
        String bucketName = "examplebucket";
        // Enter the full path of the object, excluding the bucket name, such as testfolder/exampleobject.txt.
        String objectKey = "testfolder/exampleobject.txt";

        try {
            // Enter the string.
            String content = "Hello OSS";

            // Create a PutObjectRequest object.
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, new ByteArrayInputStream(content.getBytes()));

            // To set the storage class and access permissions during upload, see the following sample code.
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            metadata.setObjectAcl(CannedAccessControlList.Private);
            putObjectRequest.setMetadata(metadata);

            // Upload the string.
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            // Print the upload result.
            System.out.println("File uploaded successfully!");
            System.out.println("ETag: " + result.getETag());
            System.out.println("Request ID: " + result.getRequestId());
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            // In singleton mode, do not close the client after each operation (to reuse the connection), as this may affect subsequent use.
            // When the OSSClient instance is no longer needed (for example, before the application exits), call the shutdown method once to release resources.
            // ossClient.shutdown();
        }
    }
}

Özel durum yönetimi

OSS Java SDK V1, her ikisi de RuntimeException sınıfından türetilen iki özel durum türü fırlatır: ClientException ve OSSException.

İstemci özel durumları (ClientException)

İstemci özel durumları, istek oluşturma, gönderme veya veri aktarımı sırasında gerçekleşir. Yaygın senaryolar şunlardır:

  • Ağ bağlantısı kullanılamıyor, bu nedenle istek sunucuya gönderilemiyor.

  • Dosya yükleme sırasında bir G/Ç istisnası oluşuyor.

  • İstek zaman aşımı veya sertifika doğrulama hatası gibi alt düzey ağ istisnaları meydana geliyor.

Bir ClientException, isteğin OSS sunucusuna ulaşmadığını veya istemci tarafında işleme sırasında bir hata olduğunu gösterir. Ağ bağlantısını ve istemci yapılandırmasını kontrol edin.

Sunucu özel durumları (OSSException)

Sunucu özel durumları, isteğin OSS'ye ulaştığını ancak reddedildiğini ifade eder. OSSException aşağıdaki bilgileri sağlar:

  • Sorunun kesin olarak belirlenmesini sağlayan ayrıntılı hata kodları ve hata iletileri içerirler.

  • Yaygın hatalar arasında SignatureDoesNotMatch, AccessDenied ve NoSuchKey bulunur.

  • Bu özel durumları hata koduna göre ele almak, program sağlamlığını ve kullanıcı deneyimini önemli ölçüde artırabilir.

Hataları doğru bir şekilde belirlemek ve işlemek için bu iki özel durum türünü ayrı ayrı yakalayın.

// Create client operation...

try {
    // Perform OSS operations, such as uploading a file, downloading a file, or listing objects.
    // These operations may throw OSS-related exceptions.
    ossClient.putObject(...);
    
} catch (OSSException oe) {
    // Catch exceptions returned by the OSS server.
    // This exception is thrown when a request successfully reaches the OSS server, but the server rejects the request.
    // Common causes: insufficient permissions, incorrect parameters, resource does not exist, etc.
    System.out.println("Caught an OSSException, which means your request made it to OSS, "
            + "but was rejected with an error response for some reason.");
    
    // Output detailed error information for problem location and debugging.
    System.out.println("Error Message: " + oe.getErrorMessage());   
    System.out.println("Error Code:       " + oe.getErrorCode());  
    System.out.println("Request ID:      " + oe.getRequestId());     
    System.out.println("Host ID:           " + oe.getHostId());      
    
} catch (ClientException ce) {
    // Catch client exceptions.
    // This exception is thrown when the client encounters a serious internal problem while communicating with OSS.
    // Common causes: network connection issues, SSL certificate issues, DNS resolution failure, etc.
    System.out.println("Caught an ClientException, which means the client encountered "
            + "a serious internal problem while trying to communicate with OSS, "
            + "such as not being able to access the network.");
    
    // Output detailed information about the client exception.
    System.out.println("Error Message: " + ce.getMessage());  
    
} finally {
    // Release client resources regardless of whether the operation succeeded or failed.
    // This is a best practice to avoid resource leaks and connection pool exhaustion.
    if (ossClient != null) {
        ossClient.shutdown();  // Close the client to release network connections and other resources.
    }
}

Örnek kod

OSS Java SDK V1; paket yönetimi, dosya işlemleri, erişim kontrolü ve şifreli aktarımı kapsayan örnek kodlar sunar:

Örnek dosya

Örnek içerik

BucketOperationsSample.java

BucketTaggingSample.java

Paket etiketleme (OSS Java SDK V1)

BucketInventorySample.java

Paket envanteri (OSS Java SDK V1)

BucketPolicySample.java

Paket ilkesi (OSS Java SDK V1)

BucketWormSample.java

Alıkoyma ilkesi (OSS Java SDK V1)

SetRequestPaymentSample.java

İstekte bulunan öder (OSS Java SDK V1)

BucketReplicationSample.java

Veri çoğaltma (OSS Java SDK V1)

BucketTransferAccelerationSample.java

Aktarım hızlandırma (OSS Java SDK V1)

CreateFolderSample.java

Basit yükleme (OSS Java SDK V1)

PostObjectSample.java

Form yükleme (OSS Java SDK V1)

Not

PostObject uygulaması Java SDK'ya bağlı değildir.

AppendObjectSample.java

Ekleme yoluyla yükleme (OSS Java SDK V1)

UploadSample.java

Kaldığı yerden devam eden yükleme (OSS Java SDK V1)

MultipartUploadSample.java

Parçalı yükleme (OSS Java SDK V1)

CallbackSample.java

Yükleme geri araması (OSS Java SDK V1)

SimpleGetObjectSample.java

Dosya indirme (OSS Java SDK V1)

DownloadSample.java

Kaldığı yerden devam eden indirme (OSS Java SDK V1)

ConcurrentGetObjectSample.java

Kaldığı yerden devam eden indirme (OSS Java SDK V1)

GetProgressSample.java

GetStartedSample.java

ObjectMetaSample.java

Dosya meta verilerini yönetme (OSS Java SDK V1)

StorageTypeSample.java

Dosyanın depolama sınıfını dönüştürme (OSS Java SDK V1)

ListObjectsSample.java

Dosyaları listeleme (OSS Java SDK V1)

BucketMetaQuerySample.java

Skaler getirme (OSS Java SDK V1)

SelectObjectSample.java

Dosya sorgulama (OSS Java SDK V1)

DeleteObjectsSample.java

Dosya silme (OSS Java SDK V1)

UploadPartCopySample.java

Dosya kopyalama (OSS Java SDK V1)

ObjectOperationSample.java

Aynı ada sahip dosyanın üzerine yazılmasını önleme (OSS Java SDK V1)

RestoreObjectSample.java

Dosya geri yükleme (OSS Java SDK V1)

SymLinkSample.java

Sembolik bağlantıları yönetme (OSS Java SDK V1)

BucketVersioningSample.java

Sürüm oluşturmayı yönetme (OSS Java SDK V1)

ObjectTaggingSample.java

TrafficLimitSample.java

Tek bağlantı bant genişliği kısıtlaması (OSS Java SDK V1)

İstemci tabanlı şifreleme (OSS Java SDK V1)

EncryptionServiceSample.java

Sunucu taraflı şifreleme (OSS Java SDK V1)

AuthorizedAccessSample.java

İmzalı URL kullanarak indirme (OSS Java SDK V1)

CRCSample.java

Veri doğrulama (OSS Java SDK V1)

ImageSample.java

Görüntü işleme (OSS Java SDK V1)

Erişim kimlik bilgisi yapılandırması

OSS, birden fazla kimlik bilgisi başlatma yöntemini destekler. Kimlik doğrulama ihtiyaçlarınıza göre bir yöntem seçin.

Erişim kimlik bilgisini nasıl seçerim?


Kimlik bilgisi sağlayıcı başlatma yöntemi


Senaryolar


Önceden var olan bir AccessKey çifti veya STS belirteci gerekir


Temel kimlik bilgisi


Kimlik bilgisi geçerliliği


Kimlik bilgisi döndürme veya yenileme yöntemi


RAM kullanıcısının AccessKey çiftini kullanma


Dış saldırılara açık olmayan, güvenli ve kararlı bir ortamda dağıtılan ve sık kimlik bilgisi döndürmesi gerektirmeyen, Alibaba Cloud hizmetlerine uzun süreli erişim sağlayan uygulamalar.


Evet


AccessKey


Uzun vadeli


Manuel döndürme


STS belirteci kullanma


Güvenilmeyen bir ortamda dağıtılan ve kontrollü erişim süresi ile izinleri gerektiren uygulamalar.


Evet


Security Token Service belirteci


Geçici


Manuel yenileme


RAMRoleARN kullanma


Hesaplar arası erişim gibi, Alibaba Cloud hizmetlerine yetkili erişim gerektiren uygulamalar.


Evet


Security Token Service belirteci


Geçici


Otomatik yenileme


ECSRAMRole kullanma


Alibaba Cloud ECS örneklerinde, ECI örneklerinde veya Container Service for Kubernetes worker düğümlerinde dağıtılan uygulamalar.


Hayır


Security Token Service belirteci


Geçici


Otomatik yenileme


OIDCRoleARN kullanma


Alibaba Cloud Container Service for Kubernetes worker düğümlerinde dağıtılan güvenilmeyen uygulamalar.


Hayır


Security Token Service belirteci


Geçici


Otomatik yenileme


Function Compute bağlamındaki kimlik bilgilerini kullanma


Alibaba Cloud Function Compute'de dağıtılan uygulama işlevleri.


Hayır


Security Token Service belirteci


Geçici


Yenileme gerekmez


CredentialsURI kullanma


Erişim kimlik bilgilerini harici bir sistemden alması gereken uygulamalar.


Hayır


Security Token Service belirteci


Geçici


Otomatik yenileme


Otomatik döndürülen AccessKey çifti kullanma


AccessKey çifti sızıntısı riski bulunan bir ortamda dağıtılan ve sık kimlik bilgisi döndürmesi gerektiren, Alibaba Cloud hizmetlerine uzun süreli erişim sağlayan uygulamalar.


Hayır


AccessKey


Uzun vadeli


Otomatik döndürme


Özel erişim kimlik bilgisi kullanma


Önceki kimlik bilgisi yapılandırma yöntemlerinden hiçbiri gereksinimlerinizi karşılamıyorsa, kimlik bilgilerini alma şeklinizi özelleştirin.


Özel


AccessKey çifti veya Security Token Service belirteci


Özel


Özel


Varsayılan kimlik bilgisi zincirini kullanma


Kimlik bilgisi istemcisini herhangi bir parametre iletmeden başlattığınızda, Credentials aracı istemciyi başlatmak için varsayılan kimlik bilgisi zincirini kullanır.


Hayır


AccessKey çifti veya Security Token Service belirteci


Özel


Otomatik yenileme

RAM kullanıcısının AccessKey çiftini kullanma

Sık kimlik bilgisi döndürmesi gerektirmeyen, uzun vadeli OSS erişimi isteyen ve güvenli bir ortamda çalışan uygulamalar için uygundur. Kimlik bilgisi sağlayıcısını bir RAM kullanıcısının AccessKey çifti (AccessKey ID ve AccessKey secret) ile başlatın. Bu yöntem manuel AccessKey çifti bakımı gerektirdiğinden güvenlik risklerini artırır.

Önemli
  • Bir Alibaba Cloud hesabı kaynakları üzerinde tam yetkilere sahiptir. AccessKey çifti sızdırılırsa sisteminiz için önemli bir risk oluşturur. Bir Alibaba Cloud hesabının AccessKey çiftini kullanmanızı önermiyoruz. Bunun yerine, minimum gerekli izinlere sahip bir RAM kullanıcısının AccessKey çiftini kullanın.

  • Bir RAM kullanıcısı için AccessKey çifti oluşturma hakkında bilgi edinmek için bkz. AccessKey çifti oluşturma. Bir RAM kullanıcısının AccessKey ID'si ve AccessKey secret'ı yalnızca AccessKey çifti oluşturulduğunda görüntülenir. Bu bilgileri unutursanız eski çifti değiştirmek için yeni bir AccessKey çifti oluşturmanız gerekir.

Ortam değişkenleri

  1. RAM kullanıcısının AccessKey çiftini kullanarak ortam değişkenlerini yapılandırın.

    Linux

    1. Komut satırı arayüzünde aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını ~/.bashrc dosyasına ekleyin.

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.

      source ~/.bashrc
    3. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. Varsayılan kabuk türünü görüntülemek için terminalde aşağıdaki komutu çalıştırın.

      echo $SHELL
    2. Varsayılan kabuk türüne göre aşağıdaki işlemleri gerçekleştirin.

      Zsh

      1. Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını ~/.zshrc dosyasına ekleyin.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.

        source ~/.zshrc
      3. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

      Bash

      1. Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını ~/.bash_profile dosyasına ekleyin.

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.

        source ~/.bash_profile
      3. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD

    1. CMD'de aşağıdaki komutları çalıştırın.

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%

    PowerShell

    1. PowerShell'de aşağıdaki komutları çalıştırın.

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. Ortam değişkenlerinin yapılandırıldığını doğrulamak için aşağıdaki komutları çalıştırın.

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. Sistem ortam değişkenlerini değiştirdikten sonra, en son sistem ortam değişkenlerinin başarıyla yüklendiğinden emin olmak için IDE'niz, komut satırı arayüzü, diğer masaüstü uygulamaları ve arka uç hizmetleri dahil geliştirme ortamınızı yeniden başlatın veya yenileyin.

  3. Kimlik bilgisi bilgilerini iletmek için ortam değişkenlerini kullanın.

    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 {
            // Obtain credentials from environment variables.
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // Use credentialsProvider for subsequent operations...
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);   
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
                    
            ossClient.shutdown();
        }
    }

Statik kimlik bilgileri

Aşağıdaki örnek kod, erişim kimlik bilgilerinin nasıl sabit kodlanacağını ve kullanılacak AccessKey çiftinin nasıl açıkça ayarlanacağını gösterir.

Önemli

Erişim kimlik bilgilerini üretim ortamındaki uygulamalara gömmeyin. Bu yöntem yalnızca test amaçlıdır.

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 {
        // Enter the AccessKey ID and AccessKey secret of the RAM user.
        String accessKeyId = "yourAccessKeyID";
        String accessKeySecret = "yourAccessKeySecret";
        
        // Use the DefaultCredentialProvider method to directly set the AccessKey ID and AccessKey secret.
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);

        // Use credentialsProvider to initialize the client.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Explicitly declare the use of the V4 signature algorithm.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // Create an OSSClient instance.
        // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();

    }
}

STS belirteci kullanma

Geçici OSS erişimine ihtiyaç duyan uygulamalar için uygundur. Kimlik bilgisi sağlayıcısını STS'den alınan geçici kimlik bilgileri (AccessKey ID, AccessKey secret ve güvenlik belirteci) ile başlatın. Tekrarlanan erişim için STS belirtecini manuel olarak yenilemeniz gerekir.

Önemli

Ortam değişkenleri

  1. Geçici kimlik bilgilerini kullanarak ortam değişkenlerini ayarlayın.

    Mac OS/Linux/Unix

    Önemli
    • Burada bir RAM kullanıcısının AccessKey çifti değil, STS hizmetinden alınan geçici kimlik bilgileri (AccessKey ID, AccessKey secret ve güvenlik belirteci) kullanılır.

    • STS hizmetinden alınan AccessKey ID'sinin "STS" ile başladığını unutmayın, örneğin "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

    Önemli
    • Burada bir RAM kullanıcısının AccessKey çifti (AccessKey ID ve AccessKey secret) değil, STS hizmetinden alınan geçici kimlik bilgileri (AccessKey ID, AccessKey secret ve güvenlik belirteci) kullanılır.

    • STS hizmetinden alınan AccessKey ID'sinin "STS" ile başladığını unutmayın, örneğin "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>
  2. Kimlik bilgisi bilgilerini ortam değişkenleri aracılığıyla iletin.

    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 {
            // Obtain credentials from environment variables.
            EnvironmentVariableCredentialsProvider credentialsProvider =  CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            
            // Use credentialsProvider to initialize the client.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

Statik kimlik bilgileri

Kimlik bilgilerini uygulamanıza sabit kodlayabilir ve kullanılacak geçici erişim anahtarını açıkça ayarlayabilirsiniz.

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 {
        // Set this to the temporary AccessKey ID, AccessKey secret, and security token obtained from the STS service, not the credential information of a RAM user.
        // Note that the AccessKey ID obtained from the STS service starts with "STS", as shown below.
        String accessKeyId = "STS.****************";
        String accessKeySecret = "yourAccessKeySecret";
        String stsToken= "yourSecurityToken";

        // Use the DefaultCredentialProvider method to directly set the AccessKey ID and AccessKey secret.
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);

        // Use credentialsProvider to initialize the client.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Explicitly declare the use of the V4 signature algorithm.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        // Create an OSSClient instance.
        // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();
    }
}

RAMRoleARN kullanma

Hesaplar arası erişim gibi, OSS'e yetkili erişime ihtiyaç duyan uygulamalar için uygundur. Kimlik bilgisi sağlayıcısını bir RAM rolünün ARN'sini belirterek başlatın. SDK, AssumeRole API'sini çağırarak STS belirteçlerini otomatik olarak alır ve yeniler. Ayrıca policy parametresini kullanarak RAM rolünün daha az izne sahip olmasını sağlayabilirsiniz.

Önemli
  • Bir Alibaba Cloud hesabı kaynakları üzerinde tam yetkilere sahiptir. AccessKey çifti sızdırılırsa sisteminiz için önemli bir risk oluşturur. Bir Alibaba Cloud hesabının AccessKey çiftini kullanmanızı önermiyoruz. Bunun yerine, minimum gerekli izinlere sahip bir RAM kullanıcısının AccessKey çiftini kullanın.

  • Bir RAM kullanıcısı için AccessKey çifti oluşturma hakkında bilgi edinmek için bkz. AccessKey çifti oluşturma. Bir RAM kullanıcısının AccessKey ID'si ve AccessKey secret'ı yalnızca AccessKey çifti oluşturulduğunda görüntülenir. Bu bilgileri zamanında kaydetmeniz gerekir. Unutursanız eski çifti değiştirmek için yeni bir AccessKey çifti oluşturmanız gerekir.

  • RAMRoleARN almak için bkz. RAM rolü oluşturma.

  1. Credentials bağımlılığını ekleyin.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. Erişim kimlik bilgisi olarak AccessKey çiftini ve RAMRoleARN'i yapılandırın.

    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();
            // Type of access credential. Set to ram_role_arn.
            config.setType("ram_role_arn");
            // The ARN of the RAM role to assume. Example: acs:ram::123456789012****:role/adminrole. You can set RoleArn through the ALIBABA_CLOUD_ROLE_ARN environment variable.
            config.setRoleArn("<RoleArn>");
            // Obtain the AccessKey ID from the environment variable.
            config.setAccessKeyId(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_ID"));
            // Obtain the AccessKey secret from the environment variable.
            config.setAccessKeySecret(System.getenv().get("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // The name of the role session. You can set RoleSessionName through the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
            config.setRoleName("<RoleSessionName>");
            // Set a smaller permission policy. This is optional. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // Set the validity period of the role session. This is optional.
            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());
                }
            };
            // Use credentialsProvider to initialize the client.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

ECSRAMRole kullanma

ECS örneklerinde, ECI örneklerinde veya Container Service for Kubernetes worker düğümlerindeki uygulamalar için uygundur. Örnek üzerine bir RAM rolü ekleyerek, manuel kimlik bilgisi yönetimi olmadan Container Service for Kubernetes veya ECS içinde STS belirteçleri otomatik olarak alınır ve yenilenir. ECSRAMRole almak için bkz. RAM rolü oluşturma. Rol ekleme hakkında bilgi edinmek için bkz. Örnek RAM rolleri.

  1. Credentials bağımlılığını ekleyin.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. Erişim kimlik bilgisi olarak ECSRAMRole'u yapılandırın.

    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();
            // Type of access credential. Set to ecs_ram_role.
            config.setType("ecs_ram_role");
            // The name of the RAM role assigned to the ECS instance.
            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());
                }
            };
            // Use credentialsProvider to initialize the client.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

OIDCRoleARN kullanma

Container Service for Kubernetes'te bir worker düğüm RAM rolü yapılandırdıktan sonra, ilgili düğümdeki pod'lardaki uygulamalar, ECS üzerinde dağıtılan uygulamalar gibi global meta hizmeti üzerinden eklenen rolün STS belirtecini alabilir. Ancak, konteyner kümesinde güvenilmeyen uygulamalar dağıtılıyorsa (örneğin, size açık olmayan koda sahip müşterileriniz tarafından gönderilen uygulamalar), bu uygulamaların global meta hizmeti üzerinden worker düğümünün eklenen örnek RAM rolünün STS belirtecini almasını istemeyebilirsiniz. Bulut kaynaklarınızın güvenliğini etkilemeden bu güvenilmeyen uygulamaların gerekli STS belirteçlerini güvenli bir şekilde almasını sağlamak ve uygulama düzeyinde izin minimizasyonu elde etmek için Hizmet Hesapları için RAM Rolleri (RRSA) özelliğini kullanabilirsiniz. Bu yöntemin temel uygulaması bir STS belirtecine dayanır. Alibaba Cloud konteyner kümesi, farklı uygulama pod'ları için ilgili hizmet hesabı OIDC belirteç dosyasını oluşturur ve bağlar ve ilgili yapılandırma bilgilerini ortam değişkenlerine enjekte eder. SDK, ortam değişkenlerindeki yapılandırma bilgilerini kullanarak STS hizmetinin AssumeRoleWithOIDC API işlemini çağırarak bağlı rolün STS belirtecini alır. Bir AccessKey çifti veya STS belirteci sağlamanız gerekmediğinden bu yöntem manuel bakım riskini ortadan kaldırır. Daha fazla bilgi için bkz. Pod izin yalıtımı sağlamak için RRSA aracılığıyla ServiceAccount için RAM izinlerini yapılandırma.

  1. Credentials bağımlılığını ekleyin.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. Erişim kimlik bilgisi olarak OIDC RAM rolünü yapılandırın.

    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();
            // Specify the Credential type. Set to oidc_role_arn.
            config.setType("oidc_role_arn");
            // The ARN of the RAM role. You can set RoleArn through the ALIBABA_CLOUD_ROLE_ARN environment variable.
            config.setRoleArn("<RoleArn>");
            // The ARN of the OIDC provider. You can set OidcProviderArn through the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
            config.setOidcProviderArn("<OidcProviderArn>");
            // The path to the OIDC token file. You can set OidcTokenFilePath through the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
            config.setOidcTokenFilePath("<OidcTokenFilePath>");
            // The name of the role session. You can set RoleSessionName through the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
            config.setRoleSessionName("<RoleSessionName>");
            // Set a smaller permission policy. This is optional. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
            config.setPolicy("<Policy>");
            // Set the session expiration time.
            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());
                }
            };
            // Use credentialsProvider to initialize the client.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

Function Compute bağlamındaki kimlik bilgilerini kullanma

Bu yöntem, Function Compute'de dağıtılan uygulama işlevleri içindir. Kimlik bilgisi sağlayıcısını Function Compute bağlamındaki kimlik bilgileriyle başlatabilirsiniz. Temel uygulama bir STS belirtecine dayanır. Function Compute, işlev için yapılandırılan hizmet rolünü üstlenerek bir STS belirteci alır ve ardından bu STS belirtecini bağlamdaki Credentials parametresi aracılığıyla uygulamanıza iletir. Bu STS belirteci 36 saat geçerlidir ve değiştirilemez. Bir işlevin maksimum yürütme süresi 24 saat olduğundan, STS belirteci işlev yürütme sırasında sona ermez ve bunu yenilemeyi düşünmenize gerek kalmaz. Bir AccessKey çifti veya STS belirteci sağlamanız gerekmediğinden bu yöntem manuel bakım riskini ortadan kaldırır. Function Compute'e OSS'e erişim izni vermek için bkz. Function Compute'e diğer Alibaba Cloud hizmetlerine erişim izni vermek için işlev rolü kullanma.

  1. Function Compute bağlam bağımlılığını ekleyin.

    <!-- 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>
  2. Kimlik bilgisi sağlayıcısını Function Compute bağlamındaki kimlik bilgileriyle başlatın.

    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 {
    
            // Obtain key information. Before execution, ensure that the service where the function resides is configured with role information, and the role has the necessary OSS permissions. We recommend using the AliyunFCDefaultRole role.
            Credentials creds = context.getExecutionCredentials();
    
            // Use the obtained credentials to create a credential provider instance.
            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken());
    
            // Use credentialsProvider to initialize the client.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
    
            outputStream.write(new String("done").getBytes());
        }
    }

CredentialsURI kullanma

Esnek kimlik bilgisi yönetimi için kimlik bilgilerini harici bir sistemden alan uygulamalar için uygundur. Kimlik bilgisi sağlayıcısını STS belirteçleri döndüren bir URI ile başlatın. SDK, belirtilen URI'den belirteçleri otomatik olarak alır ve yeniler.

  1. SDK'nin STS belirtecini doğru şekilde ayrıştırıp kullanabilmesi için URI aşağıdaki yanıt protokolünü izlemelidir:

    • Yanıt durum kodu: 200

    • Yanıt gövdesi yapısı:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. Credentials bağımlılığını ekleyin.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  3. Erişim kimlik bilgisi olarak CredentialsURI'yi yapılandırın.

    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();
            // Type of access credential. Set to credentials_uri.
            config.setType("credentials_uri");
            // The URI of the credential, which is the address of your server that generates STS tokens, in the format http://local_or_remote_uri/. You can set CredentialsUri through the ALIBABA_CLOUD_CREDENTIALS_URI environment variable.
            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());
                }
            };
            // Use credentialsProvider to initialize the client.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }

Otomatik döndürülen AccessKey çifti kullanma

AccessKey sızıntısı riski bulunan ortamlarda OSS'e uzun süreli erişim gerektiren uygulamalar için uygundur. Kimlik bilgisi sağlayıcısını bir ClientKey ile başlatın. KMS, yönetilen RAM kullanıcısının AccessKey çiftini otomatik olarak döndürerek statik kimlik bilgilerini dinamik hale getirir ve sızıntı riskini azaltır. KMS ayrıca anında döndürmeyi de destekler. ClientKey edinmek için bkz. Uygulama erişim noktası oluşturma.

  1. Kimlik bilgisi istemci bağımlılığını ekleyin.

    <!-- 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>
  2. secretsmanager.properties yapılandırma dosyasını oluşturun.

    # Type of access credential, fixed as client_key
    credentials_type=client_key
    
    # Decryption password for reading the Client Key: supports reading from an environment variable or a file, only one needs to be set
    client_key_password_from_env_variable=<your client key private key password environment variable name>
    client_key_password_from_file_path=<your client key private key password file path>
    
    # Path to the Client Key's private key file
    client_key_private_key_path=<your client key private key file path>
    
    # Associated KMS service region
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. Kimlik bilgilerini iletmek için yapılandırma dosyasını kullanın.

    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;
                    }
                }
            };
            // Use credentialsProvider to initialize the client.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
    
            ossClient.shutdown();
        }
    }
    

Özel erişim kimlik bilgisi kullanma

Önceki kimlik bilgisi yapılandırma yöntemlerinden hiçbiri gereksinimlerinizi karşılamıyorsa, Credential Providers arayüzünü uygulayarak kimlik bilgisi sağlayıcısını özelleştirebilirsiniz. Altta yatan uygulama bir STS belirtecine dayanıyorsa, kimlik bilgisi güncellemeleri için destek sağlamanız gerektiğini unutmayın.

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(){

            // Initialize variable
            String accessKeyId = null;
            // Initialize variable
            String accessKeySecrect = null;
            // Initialize variable
            // String token = null;

            @Override
            public void setCredentials(Credentials credentials) {
            }

            @Override
            public Credentials getCredentials() {
                //TODO
                //Customize the method for obtaining access credentials.

                // Return long-term credentials: access_key_id, access_key_secrect  
                return new DefaultCredentials(accessKeyId, accessKeySecrect);

                // Return temporary credentials: access_key_id, access_key_secrect, token
                // For temporary credentials, you need to refresh them based on their expiration time.
                // return new DefaultCredentials(accessKeyId, accessKeySecrect, token);
            }
        };
        // Use credentialsProvider to initialize the client.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Explicitly declare the use of the V4 signature algorithm.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
        // Create an OSSClient instance.
        // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
        OSS ossClient = OSSClientBuilder.create()
                .endpoint("endpoint")
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region("region")
                .build();

        ossClient.shutdown();
    }
}

Varsayılan kimlik bilgisi zincirini kullanma

Kimlik bilgisi istemcisini parametre belirtmeden başlattığınızda SDK varsayılan kimlik bilgisi zincirini kullanır. Kimlik bilgisi zinciri mantığı için bkz. Varsayılan kimlik bilgisi zinciri.

  1. Kimlik bilgileri bağımlılığını ekleyin.

    <!-- https://mvnrepository.com/artifact/com.aliyun/credentials-java -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>credentials-java</artifactId>
        <version>LATEST</version>
    </dependency>
  2. Erişim kimlik bilgisi olarak Credentials'ı yapılandırın.

    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();
            // Explicitly declare the use of the V4 signature algorithm.
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);  
            // Use credentialsProvider to initialize the client.
            // Create an OSSClient instance.
            // When the OSSClient instance is no longer needed, call the shutdown method to release resources.
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint("endpoint")
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region("region")
                    .build();
            ossClient.shutdown();
        }
    }

SSS

Paket çakışmaları

  • Neden

    OSS Java SDK V1'i kullandığınızda aşağıdakine benzer bir hata, projenizde bir paket çakışması olduğunu gösterir.

    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
                        

    veya

    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)
                        

    Bu hata, OSS Java SDK V1'in Apache HttpClient 4.4.1 kullanmasından, ancak projenizin çakışan bir Apache HttpClient sürümü veya bir commons-httpclient JAR paketi kullanmasından kaynaklanır. Projenizin kullandığı JAR paketlerini ve bunların sürümlerini görüntülemek için proje dizininizde mvn dependency:tree komutunu çalıştırabilirsiniz. Proje, standart sürümle çakışan Apache HttpClient 4.3 kullanmaktadır:

    [INFO] --- maven-dependency-plugin:2.2:tree (default-cli) @ maven-demo ---
    [INFO] com.aliyun.oss:maven-demo:jar:0.1.1-SNAPSHOT
    [INFO] +- junit:junit:jar:4.10:test
    [INFO] |  \- org.hamcrest:hamcrest-core:jar:1.1:test
    [INFO] +- org.apache.httpcomponents:httpclient:jar:4.3:compile
    [INFO] |  +- org.apache.httpcomponents:httpcore:jar:4.3:compile
    [INFO] |  +- commons-logging:commons-logging:jar:1.1.3:compile
    [INFO] |  \- commons-codec:commons-codec:jar:1.6:compile
    [INFO] \- com.aliyun.oss:aliyun-sdk-oss:jar:2.2.1:compile
    [INFO]    +- org.jdom:jdom:jar:1.1:compile
    [INFO]    \- net.sf.json-lib:json-lib:jar:jdk15:2.4:compile
    [INFO]       +- commons-beanutils:commons-beanutils:jar:1.8.0:compile
    [INFO]       +- commons-collections:commons-collections:jar:3.2.1:compile
    [INFO]       +- commons-lang:commons-lang:jar:2.5:compile
    [INFO]       \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile
  • Çözüm

    Paket çakışmalarını aşağıdaki iki yoldan biriyle çözün:

    • Sürümü birleştirin: Projeniz Apache HttpClient 4.4.1 ile çakışan bir sürüm kullanıyorsa projenizi 4.4.1 sürümünü kullanacak şekilde güncelleyin ve pom.xml dosyasından diğer Apache HttpClient sürümlerine yönelik bağımlılıkları kaldırın. Projeniz commons-httpclient kullanıyorsa da bir çakışma olabilir. commons-httpclient bağımlılığını kaldırın.

    • Bağımlılık çakışmalarını çözün: Projeniz birden çok üçüncü taraf pakete bağımlıysa ve bu paketler farklı Apache HttpClient sürümlerine bağımlıysa projenizde bağımlılık çakışmaları oluşur. Bunları exclusion etiketini kullanarak çözebilirsiniz. Daha fazla bilgi için bkz. Maven Kılavuzları.

    OSS Java SDK V1 aşağıdaki paket sürümlerine bağımlıdır. Çakışma çözme yöntemi HttpClient ile benzerdir.

    [INFO] com.aliyun.oss:maven-demo:jar:0.1.1-SNAPSHOT
    [INFO] +- junit:junit:jar:4.10:test
    [INFO] |  \- org.hamcrest:hamcrest-core:jar:1.1:test
    [INFO] \- com.aliyun.oss:aliyun-sdk-oss:jar:2.2.1:compile
    [INFO]    +- org.apache.httpcomponents:httpclient:jar:4.4.1:compile
    [INFO]    |  +- org.apache.httpcomponents:httpcore:jar:4.4.1:compile
    [INFO]    |  +- commons-logging:commons-logging:jar:1.2:compile
    [INFO]    |  \- commons-codec:commons-codec:jar:1.9:compile
    [INFO]    +- org.jdom:jdom:jar:1.1:compile
    [INFO]    \- net.sf.json-lib:json-lib:jar:jdk15:2.4:compile
    [INFO]       +- commons-beanutils:commons-beanutils:jar:1.8.0:compile
    [INFO]       +- commons-collections:commons-collections:jar:3.2.1:compile
    [INFO]       +- commons-lang:commons-lang:jar:2.5:compile
    [INFO]       \- net.sf.ezmorph:ezmorph:jar:1.0.6:compile

Eksik paketler

  • Neden

    OSS Java SDK V1'i kullandığınızda aşağıdakine benzer bir hata, projenizde OSS Java SDK V1'i derlemek veya çalıştırmak için gereken paketlerin eksik olabileceğini gösterir.

    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 more
                        

    veya

    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 more
                        

    veya

    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 more
                        

    OSS Java SDK V1 aşağıdaki paketlere bağımlıdır:

    • 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

    Bunlardan log4j-1.2.15.jar isteğe bağlı bir bağımlılıktır. Bu paketi yalnızca günlük kaydı işlevselliğine ihtiyaç duyduğunuzda ekleyin. Diğer paketler gereklidir.

  • Çözüm

    OSS Java SDK V1'in bağımlı olduğu paketleri projenize ekleyin. Aşağıdaki yöntemlerden birini kullanabilirsiniz:

    • Eclipse projesi: bkz. SDK'yı yükleme.

    • Ant projesi: OSS Java SDK V1'in bağımlı olduğu paketleri projenizin lib dizinine yerleştirin.

    • Doğrudan derleme: OSS Java SDK V1'in bağımlı olduğu paketlerin yolunu belirtmek için -classpath veya -cp komutunu kullanın veya bu paketleri classpath'e yerleştirin.

Bağlantı zaman aşımı

  • Neden

    Bir OSS Java SDK V1 programı çalıştırdığınızda, yanlış uç nokta veya ağ bağlantısı sorunları nedeniyle aşağıdakine benzer bir hata oluşabilir.

    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 more
                        
  • Çözüm

    Hatanın nedenini hızla bulmak ve sorunu çözmek için ossutil aracını kullanabilirsiniz.

SignatureDoesNotMatch hatası

  • Neden 1: Eşleşmeyen AccessKey çifti bilgileri

    AccessKey ID ve AccessKey secret eşleşmiyor. AccessKey ID ve AccessKey secret edinme hakkında bilgi için bkz. AccessKey çifti oluşturma.

  • Neden 2: İmzalı URL'nin yanlış kullanımı

    Aşağıda imzalı bir URL'nin yanlış kullanımına ilişkin bir örnek verilmiştir:

    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);

    Method parametresi belirtilmezse varsayılan olarak GET yöntemi kullanılır. Ancak yukarıdaki örnek bir PutObject isteğidir. Bu nedenle Method parametresi belirtilmeli ve PUT olarak ayarlanmalıdır.

    Bir PutObject isteği gönderdiğinizde, istek üstbilgisindeki özel meta verilerin x-oss-meta- önekiyle başlaması gerekir. Yukarıdaki örnekte özel meta veri x-oss-meta-author olarak değiştirilmelidir.

    Çözüm: Method parametresini belirtin ve üstbilgi önekini değiştirin.

    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);
  • Neden 3: HttpClient sürüm uyumluluğu sorunu

    • 3.7.0'dan önceki bir OSS SDK sürümü kullanılır ve projeye HttpClient 4.5.9 veya sonraki bir sürüm dahil edilir.

    • Karşıya yüklenen dosyanın adı bir + karakteri içerir ve HttpClient 4.5.9 + karakterini URL kodlamaz. Bu durum, istemci ve sunucu tarafından hesaplanan imzaların tutarsız olmasına neden olur.

    320  POST /a HTTP/1.1  (application/json)
      107  HTTP/1.1 200   (application/json)
      453  PUT /%E4%B8%AD%E6%96%87%2B%E6%B5%8B%E8%AF%95  HTTP/1.1
      375  HTTP/1.1 200 OK
      364  POST /p HTTP/1.1  (application/json)
     1108  HTTP/1.1 200   (application/json)
     1017  POST /a HTTP/1.1  (application/json)
      107  HTTP/1.1 200   (application/json)
      450  PUT /%E4%B8%AD%E6%96%87+%E6%B5%8B%E8%AF%95  HTTP/1.1
     1183  HTTP/1.1 403 Forbidden
      325  POST /a HTTP/1.1  (application/json)
      107  HTTP/1.1 200   (application/json)

    Çözüm: Aşağıdaki yöntemlerden birini kullanın.

    • HttpClient 4.5.9 ile uyumlu olması için OSS SDK'yı 3.11.1 veya sonraki bir sürüme yükseltin.

    • Gereksiz HttpClient bağımlılıklarını kaldırın. OSS SDK'yı dahil ettiğinizde HttpClient bağımlılığı otomatik olarak dahil edilir. Üçüncü taraf bir kitaplık da HttpClient dahil ediyorsa Paket çakışmaları bölümündeki çözüme bakın.

  • Neden 4: HttpClient karakter kümesi uyumluluğu sorunu

    HttpClient 4.5.10, üstbilgide ISO-8859-1 standardının dışındaki karakterleri desteklemez. HttpClient'ın 4.5.10'dan sonraki bir sürümünü kullanan bir projede, istek üstbilgisi x-oss-meta- ile başlayan özel meta verilerdeki Çince karakterler gibi ISO-8859-1 standardının dışındaki karakterleri içeriyorsa bir sorun oluşur.

    String content = "123";
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setHeader("x-oss-meta-filename", "xxx");
    PutObjectRequest request = new PutObjectRequest(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
    request.setMetadata(metadata);
    ossClient.putObject(request);

    Çözüm: Aşağıdaki yöntemlerden birini kullanın.

    • Çakışan HttpClient sürümünü kaldırmak için Paket çakışmaları bölümündeki çözüme bakın.

    • İstek üstbilgisinde yalnızca ISO-8859-1 standardına uygun karakterleri iletin.

"Failed to parse the response result" özel durumu

com.aliyun.oss.OSSException: Failed to parse the response result.
[ErrorCode]: InvalidResponse
[RequestId]: null
[HostId]: null
	at com.aliyun.oss.common.utils.ExceptionFactory.createOSSException(ExceptionFactory.java:109)
	at com.aliyun.oss.common.utils.ExceptionFactory.createInvalidResponseException(ExceptionFactory.java:91)
	at com.aliyun.oss.common.utils.ExceptionFactory.createInvalidResponseException(ExceptionFactory.java:81)
	at com.aliyun.oss.internal.OSSErrorResponseHandler.handle(OSSErrorResponseHandler.java:71)
	at com.aliyun.oss.common.comm.ServiceClient.handleResponse(ServiceClient.java:248)
	at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:130)
	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:149)
	at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
	at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:273)
	at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:301)
	at com.aliyun.oss.OSSClient.getObject(OSSClient.java:545)
  • Neden

    İstemci tarafındaki belirli özel yazılımlar HTTP isteğini engeller veya bir genel ağ rotası HTTP isteğini ele geçirir.

    Java 9 veya sonraki bir sürümde OSS Java SDK V1 kullanıyorsunuz ve JAXB ile ilgili bağımlılıkları pom.xml dosyasına eklemediniz.

  • Çözüm

    Bir HTTPS isteğine geçiş yapın.

    JAXB ile ilgili bağımlılıkları ekleyin. Yordam için bkz. SDK'yı yükleme.

org.apache.http.NoHttpResponseException: The target server failed to respond

  • Neden

    Bir OSS Java SDK V1 programı çalıştırdığınızda aşağıdakine benzer bir hata bildirilir:

    com.aliyun.oss.ClientException: Unknown
    	at com.aliyun.oss.common.utils.ExceptionFactory.createNetworkException(ExceptionFactory.java:68) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.common.comm.DefaultServiceClient.sendRequestCore(DefaultServiceClient.java:115) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.common.comm.ServiceClient.sendRequestImpl(ServiceClient.java:121) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.common.comm.ServiceClient.sendRequest(ServiceClient.java:67) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.internal.OSSOperation.send(OSSOperation.java:92) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:140) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:111) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.internal.OSSMultipartOperation.initiateMultipartUpload(OSSMultipartOperation.java:206) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.aliyun.oss.OSSClient.initiateMultipartUpload(OSSClient.java:765) ~[aliyun-sdk-oss-2.1.0.jar:na]
    	at com.taobao.agoo.dump.client.OssTools.multipartUpload(OssTools.java:79) ~[agoo-dump-client-2.0.0-SNAPSHOT.jar:na]
    	at com.taobao.agoo.dump.biz.manager.TaskExecutorManager$UploadTask.run(TaskExecutorManager.java:114) ~[agoo-dump-biz-2.0.0-SNAPSHOT.jar:na]
    	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_51]
    	at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_51]
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_51]
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_51]
    	at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]
    Caused by: org.apache.http.NoHttpResponseException: The target server failed to respond
    	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143) ~[httpclient-4.4.jar:4.4]
    	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57) ~[httpclient-4.4.jar:4.4]
    	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:261) ~[httpcore-4.4.jar:4.4]
    	at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:165) ~[httpcore-4.4.jar:4.4]
    	at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:167) ~[httpclient-4.4.jar:4.4]
    	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:272) ~[httpcore-4.4.jar:4.4]

    Süresi dolmuş bir bağlantının kullanılması yukarıdaki hataya neden olur. Bu hata yalnızca 2.1.2'den önceki Java SDK sürümlerinde oluşur.

  • Çözüm

    OSS Java SDK V1'i 2.1.2 veya sonraki bir sürüme yükseltin.

JVM'de çok sayıda org.apache.http.impl.conn.PoolingHttpClientConnectionManager örneği mevcut

  • Neden

    ossClient doğru şekilde kapatılmadı.

  • Çözüm

    ossClient yürütmeyi tamamladıktan sonra kapatın veya singleton desenini kullanın.

OSS Java SDK V1 çağrısı yanıt vermiyor

  • Neden

    Bir OSS Java SDK V1 çağrısı yanıt vermiyor. Yığını görüntülemek için jstack -l pid komutunu çalıştırarak sorunu aşağıdaki konumda tespit edebilirsiniz:

    "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)
                        

    Neden, bağlantı havuzundaki bir bağlantı sızıntısıdır; bu durum büyük olasılıkla ossObject kullanıldıktan sonra doğru şekilde kapatılmadığı için oluşur.

  • Çözüm

    Bağlantı sızıntısı olmadığından emin olmak için programınızı kontrol edin. Bağlantıyı doğru şekilde kapatmak için aşağıdaki yöntemi kullanın:

    // Read the file.
    OSSObject ossObject = ossClient.getObject(bucketName, objectName);
    // OSS operation
    // Close ossObject.
    ossObject.close();                

Bağlantı kapatıldı

  • Neden

    ossClient.getObject kullanırken aşağıdakine benzer bir hatayla karşılaşırsanız:

    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)
                        

    Neden, iki veri okuma işlemi arasındaki aralığın 1 dakikayı aşmasıdır. OSS, 1 dakikadan uzun süredir boşta olan bağlantıları kapatır.

  • Çözüm

    Her seferinde verilerin yalnızca bir kısmını okuyorsanız ve işleme süresi değişiyorsa bağlantı kapanmasını önlemek için aralık indirmeyi kullanın. Aralık indirme tamamlandıktan sonra bağlantı otomatik olarak kapanır. Aralık indirme (OSS Java SDK V1).

Bellek sızıntısı

  • Neden

    OSS Java SDK V1'i çağıran bir program bir süre çalıştıktan sonra bellek sızdırır (iş hacmine bağlı olarak birkaç saatten birkaç güne kadar). Bellek kullanımını analiz etmek için Eclipse Memory Analyzer (MAT) kullanmanızı öneririz. Daha fazla bilgi için bkz. MAT ile yığın döküm dosyalarını analiz etme.

    Analiz sonucu aşağıdaki şekle benzerse (PoolingHttpClientConnectionManager belleğin %96'sını kaplar), neden programda new OSSClient işleminin birden çok kez yürütülmüş ancak ossClient.shutdown çağrısının yapılmamış olması ve bunun sonucunda bir bellek sızıntısına neden olunmasıdır.

  • Çözüm

    new OSSClient işlemi tamamlandıktan sonra kapatmak için shutdown yöntemini çağırın. new OSSClient ve ossClient.shutdown işlemlerinin çift olarak kullanılmasını sağlayın.

ossClient.shutdown çağrıldığında InterruptedException bildiriliyor

  • Neden

    2.3.0'dan önceki OSS Java SDK V1 sürümleri, ossClient.shutdown çağrıldığında aşağıdaki özel durumu bildirir:

    java.lang.InterruptedException: sleep interrupted
            at java.lang.Thread.sleep(Native Method)
            at com.aliyun.oss.common.comm.IdleConnectionReaper.run(IdleConnectionReaper:76)      

    Neden, ossClient arka plan iş parçacığı IdleConnectionReaper'ın boşta kalan bağlantıları düzenli olarak kapatmasıdır. IdleConnectionReaper Sleep durumundayken ossClient.shutdown çağrılırsa yukarıdaki özel durum bildirilir.

  • Çözüm

    Özel durumu yoksaymak için aşağıdaki kodu kullanın:

    try {
        ossClient.shutdown();
    } catch(Exception e) {
    }                  

"SDK.ServerUnreachable : Speicified endpoint or uri is not valid" özel durumu

SunshineE/android/01040181-2018-05-07173747-860769-online=1.jpg</cloudUrl><fileSize>4096</fileSize>&lt;lossName/&gt;<loss
...skipping...
com.aliyuncs.exceptions.ClientException: SDK.ServerUnreachable : Speicified endpoint or uri is not valid.
    at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:201)
    at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:151)
    at com.aliyuncs.DefaultAcsClient.doAction(DefaultAcsClient.java:59)
    at com.aliyuncs.DefaultAcsClient.getAcsResponse(DefaultAcsClient.java:103)
    at com.sunyard.insurance.oss.aliyun.GetSts.assumeRole(GetSts.java:50)
    at com.sunyard.insurance.oss.aliyun.GetSts.getSts(GetSts.java:60)
    at com.sunyard.insurance.ecm.web.action.oss.OssInfoAction.getUpOssInfo(OssInfoAction.java:259)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  • Neden

    • İstemci, STS'ye çok sayıda eşzamanlı istek gönderiyor.

    • Sunucuya olan ağ bağlantısı zaman aşımına uğruyor.

    • Kullanılan STS SDK ve SDK çekirdeği en son sürümlerde değil.

  • Çözüm

    • OSS eşzamanlılığını azaltın. İstemci STS'ye çok fazla eşzamanlı istek gönderiyorsa, istemcinin ECS örneği veya yerel bilgisayarı yükü kaldıramayabilir.

    • Kullanıcıdan sunucuya giden ağ bağlantısı zaman aşımına uğrar. Bunu doğrulamak için paket yakalama yapabilirsiniz.

    • STS SDK ve SDK çekirdeğini en son sürümlere yükseltin.

NoSuchKey

case:java.lang.Exception: com.aliyun.oss.OSSException:
Not Foundn[ErrorCode]: NoSuchKeyn
  • Neden

    Kaynak dosya mevcut değil.

  • Çözüm

    404 hatası konusuna bakın.

SocketException

2018-10-10 16:21:11,127 ERROR com.qunhe.instdeco.plan.maxservice.convert.Converter
downloadOssObject:taskId:LO63HXQKN4BMWM4BAU888888:
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:128)
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:149)
at com.aliyun.oss.internal.OSSOperation.doOperation(OSSOperation.java:113)
at com.aliyun.oss.internal.OSSObjectOperation.getObject(OSSObjectOperation.java:273)
  • Neden

    Yuva (socket), başlatma aşamasında başarısız olmuş olabilir; bu durum, isteğin OSS'ye ulaşmadan önce başarısız olmasına neden olur.

  • Çözüm

    Aşağıdaki noktaları kontrol etmenizi öneririz:

    • Sorun ortaya çıktığında ağ dalgalanması olup olmadığı.

    • Ana bilgisayardaki yuva bağlantısı sayısının sınıra ulaşıp ulaşmadığı.

    • Sorun oluştuğunda bağlantı sayısının SDK'daki maxconnection ayarını aşıp aşmadığını onaylayın. Bağlantı sayısı maxconnection ayarını aşarsa bir yuva özel durumu da oluşur.

    Yukarıdakilerde sorun yoksa, tcpdump veya Wireshark dağıtarak paket yakalamanızı ve sorun tekrarlandıktan sonra veri paketlerini analiz etmenizi öneririz.

OSS PostObject geri araması tetiklenmiyor

OSS PostObject geri araması tetiklenmiyor ancak aynı geri arama PutObject tarafından tetikleniyor. Genel olarak, JSON biçimi yanlışsa veya geri arama başarısız olursa ilgili bir mesaj döndürülür. Bu durumda, Put ve Post geri arama davranışlarını ayrı ayrı test etmeniz gerekir:

Aşağıdaki Wireshark yakalaması bir OSS Callback HTTP POST isteğini ve sunucu yanıtını göstermektedir:

POST /RevIce.ashx HTTP/1.1
Host: 47.xx.xxx.168
Connection: close
Content-Length: xxx
Authorization: xxx
Content-MD5: KdeBTxxx
Content-Type: appli...
User-Agent: aliyun-xxx
x-oss-additional-he...
x-oss-bucket: null8
x-owner: A4A64...
x-oss-pub-key-url: xxx
x-oss-request-id: xxx
x-oss-signature-ver...
x-oss-tag: CALLBACK
eagleye-rpcid: 0.1

bucket: xxx

HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: text/plain
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 12 Feb 2018 02:52:44 GMT
Connection: close

{"a":"b"}
  • Neden

    İstek gönderilirken callback parametresi yanlışlıkla file parametresinin içine yerleştirilmiştir.

    LTAI*xxx
    --94311149156168
    Content-Disposition: form-data; name="policy"
    
    eyjleHBpcmF0aW9UIjogIjIxMjAtMDEtMDFU
    --94311149156168
    Content-Disposition: form-data; name="Signature"
    
    gncf07Apde0vqaMWBto18XxzoH0=
    --94311149156168
    Content-Disposition: form-data; name="file"; filename="1.txt"
    Content-Type: text/plain
    
    --94311149156168
    Content-Disposition: form-data; name="callback"
    
    eyJ3YWxsYmFja1VybCI6Imh0dHA6Ly9vc3MtZGVtby5hbGl5dW5jcy5jb20eyJ3YWxsYmFja1VybCI6ImhxMTYxMTYxNjE2MTYxNjE2
    
    12345678910
    --94311149156168--
    HTTP/1.1 204 No Content
    Server: AliyunOSS
    Date: xxx
  • Çözüm

    Geri arama ve dosya parametrelerinin konumunu ayarlayın.

    Content-Disposition: form-data; name="policy"
    
    eyjleHBpcmF0aW9uIjogIjIxMjAtMDEtMDFUMTI6MDA6MDAuMDAwWiIs]xxx
    --9431149156168
    Content-Disposition: form-data; name="Signature"
    
    gncf07Apde0vqaMWBtol8XxzoH0=
    --9431149156168
    Content-Disposition: form-data; name="callback"
    
    eyJjYWxsYmFja1VybCI6Imh0dHA6Ly80xxx MTYuMTY4LjFxxxIn0=
    
    --9431149156168
    Content-Disposition: form-data; name="file"; filename="1.txt"
    Content-Type: text/plain
    
    12345678910
    --9431149156168--
    HTTP/1.1 200 OK
    Server: AliyunOSS
    Date: Mon, 12 Feb 2018 06:39:22 GMT
    Content-Type: application/json

    Bu noktada test sonucu, iş sunucusunun isteği başarıyla yakaladığını göstermektedir.

    POST /Revice.ashx HTTP/1.1
    Host: 47.93.116.168
    Connection: close
    Content-Length: 26
    Authorization: kn8kVDJOdte9CHcRX1=xxx
    Content-Type: application/x-www-xxx
    Date: Mon, 12 Feb 2018 06:40:54
    User-Agent: aliyun-oss-callback
    x-oss-additional-headers:
    x-oss-bucket: ruide
    x-oss-owner: 44414
    x-oss-pub-key-url: aHR0cHM6Ly9nb2xxx...SuZN=
    x-oss-request-id: 5A8136F6002618Hxxx
    x-oss-requester: 232379785371xxx
    x-oss-signature-version: 1.0
    x-oss-tag: CALLBACK
    eagleeye-rpcid: 0.1
    
    {"bucket"=ruide,"size"=11}
    
    HTTP/1.1 200 OK
    Cache-Control: private
    Transfer-Encoding: chunked
    Content-Type: text/plain
    Server: Microsoft-IIS/7.5
    X-AspNet-Version: 4.0.30319
    X-Powered-By: ASP.NET
    Date: Mon, 12 Feb 2018 06:40:54 GMT
    Connection: close
    
    {"a":"b"}

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 more
  • Neden

    ossClient.shutdown() yöntemini çağırdıktan sonra ossClient üzerinden istek göndermeye devam ediyorsunuz.

  • Çözüm

    Çağrı mantığınızı kontrol edin ve ossClient.shutdown() yöntemini çağırdıktan sonra ossClient üzerinden artık istek göndermediğinizden emin olun.

Java SDK'nın generatePresignedUrl yöntemiyle oluşturulan isteklerde "Request has expired" hatası oluşuyor

  • Neden

    Bir tamsayı taşması, 2038 sorunuyla ilgili bir zaman damgası sorununa neden oluyor.

    URL için belirlenen sona erme süresinden sonra bir yükleme isteği başlatılıyor.

  • Çözüm

    Sorun bir tamsayı taşmasından kaynaklanıyorsa, Java SDK'daki sona erme süresinin 2038 yılını aşmamasını öneririz.

    Yükleme isteği URL için belirlenen sona erme süresinden sonra başlatılıyorsa, sona erme süresinin isteği başlattığınız zamandan daha sonraki bir tarih olduğundan emin olmak için makul bir sona erme süresi belirleyin.

"Invalid Response" veya "Implementation of JAXB-API has not been found on module path or classpath" hatası

  • Neden

    Java 9 veya üzeri bir sürüm kullanıyorsunuz ve JAXB bağımlılığını eklemediniz.

  • Çözüm

    JAXB bağımlılığının nasıl ekleneceği hakkında bilgi için SDK'yı Yükleme konusuna bakın.

OSS Java SDK V1'deki OSSClient iş parçacığı açısından güvenli midir?

  1. OSSClient iş parçacığı açısından güvenlidir ve birden çok iş parçacığının aynı örneğe erişmesine olanak tanır. İş ihtiyaçlarınıza bağlı olarak tek bir OSSClient örneğini yeniden kullanabilir veya birden çok örnek oluşturabilirsiniz.

  2. Bir OSSClient örneği dahili olarak bir bağlantı havuzunu korur. Bir OSSClient örneğine artık ihtiyaç duyulmadığında, çok sayıda OSSClient örneği oluşturulmasından kaynaklanan kaynak tükenmesini önlemek için kapatma yöntemini çağırarak örneği kapatmanız gerekir.

"AccessDenied Hierarchical namespace is disabled" hatası bildiriliyor

  • Neden

    CreateDirectory, Rename veya DeleteDirectory API işlemisini çağırmadan önce hiyerarşik ad alanı etkinleştirilmemişti.

  • Çözüm

    Bir paket oluştururken hiyerarşik ad alanını etkinleştirin. Ayrıntılı yordam için Paket oluşturma konusuna bakın.

İstemci ağı normal çalışıyor ancak HTTP erişimi sırasında "Connection reset" hatası bildiriliyor. Bu durumu nasıl ele almalıyım?

Bazı bölgelerdeki operatörler OSS alan adını ele geçirebilir. Uç nokta üzerinden HTTPS yapılandırın. İstemciyi yapılandırma konusuna bakın.

Java 17 Cannot invoke "java.lang.reflect.Method.invoke(Object, Object[])" because "com.sun.xml.bind.v2.runtime.reflect.opt.Injector.defineClass" is null

  • Neden

    JAXB, Java 9'da kullanım dışı olarak işaretlendi ve Java 11'de kaldırıldı.

  • Çözüm

    Aşağıdaki bağımlılıkları ekleyin:

        <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>

Java SDK için dahili günlük yazdırmayı nasıl yapılandırırım?

Java SDK, günlük yazdırma için Apache Commons Logging (JCL) çerçevesini kullanır. JCL, birden çok günlük uygulama çerçevesi kullanabilir. Daha fazla bilgi için JCL-Yapılandırma konusuna bakın. En yaygın olanları log4j üzerinden JCL veya SLF4j üzerinden JCL'dir. Uygulama yöntemleri aşağıdaki gibidir:

  • log4j üzerinden JCL: log4j bağımlılığını (log4j 2.x, seçilebilecek birden çok uygulama çerçevesine sahiptir; varsayılan log4j-api+log4j-core'dur) eklemeniz ve log4j yapılandırma yöntemine göre yapılandırmanız gerekir. Ayrıntılı süreç için APACHE LOG4J-API Ayırma konusuna bakın.

  • slf4j üzerinden JCL: jcl-over-slf4j ve slf4j bağımlılıklarını (slf4j'in de slf4j-api+logback-classic gibi seçilebilecek birden çok uygulama çerçevesi vardır) eklemeniz ve slf4j yapılandırma yöntemine göre yapılandırmanız gerekir. Ayrıntılı süreç için SJF4J-Eski API'leri Köprüleme konusuna bakın.

Apache Log4j, OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE ve ALL dahil olmak üzere farklı günlük düzeylerini tanımlar.

log4j özelliklerini yapılandırarak SDK günlüklerini etkinleştirebilir veya devre dışı bırakabilirsiniz:

#
log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFA.File=${ossdemo.log.dir}/${ossdemo.log.file}

# Rollver at midnight
log4j.appender.DRFA.DatePattern=.yyyy-MM-dd

# 30-day backup
#log4j.appender.DRFA.MaxBackupIndex=30
log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout

# Pattern format: Date LogLevel LoggerName LogMessage
log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
# Debugging Pattern format
#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L))  - %m%n

#
# console
# Add "console" to rootlogger above if you want to use this
#

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

log4j.logger.org.apache.http=off

# oss log level
log4j.logger.com.aliyun.oss=DEBUG

OSS Java SDK V2'ye Yükseltme

OSS Java SDK V2 artık kullanılabilir durumdadır. Basitleştirilmiş bir API ve geliştirilmiş yeniden deneme mekanizmaları sunar. V1'den V2'ye geçiş yapmak için Java SDK V1'den V2'ye Geçiş Kılavuzu konusuna bakın.