Hızlı entegrasyon
OSS Java SDK V1'i entegre etmek için:
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
OSS Java SDK V1'i indirin.
Paketi sıkıştırmadan çıkarın.
Sıkıştırması açılan paketteki aliyun-sdk-oss-3.17.4.jar dosyasını ve
libklasöründeki tüm dosyaları projenize kopyalayın.Eclipse'te projenize sağ tıklayın ve seçeneklerini belirleyin.
Kopyalanan tüm JAR dosyalarını seçin ve Libraries bölümüne aktarın.
JAR paketlerini IntelliJ IDEA projesine aktarma
OSS Java SDK V1'i indirin.
Paketi sıkıştırmadan çıkarın.
Sıkıştırması açılan paketteki aliyun-sdk-oss-3.17.4.jar dosyasını ve
libklasöründeki tüm JAR dosyalarını projenize kopyalayın.IntelliJ IDEA'da projenizi seçin ve seçeneklerini belirleyin.
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.
RAM konsolunda Permanent AccessKey Pair içeren bir RAM kullanıcısı oluşturun. AccessKey çiftini kaydedin ve kullanıcıya
AliyunOSSFullAccessiznini verin.-
RAM kullanıcısının AccessKey çiftini kullanarak ortam değişkenlerini yapılandırın.
Linux
-
Komut satırı arabiriminde aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını
~/.bashrcdosyasına ekleyin.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.
source ~/.bashrc -
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
-
Varsayılan kabuk türünü görüntülemek için terminalde aşağıdaki komutu çalıştırın.
echo $SHELL -
Varsayılan kabuk türüne göre aşağıdaki işlemleri gerçekleştirin.
Zsh
-
Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını
~/.zshrcdosyasına ekleyin.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.
source ~/.zshrc -
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
-
Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını
~/.bash_profiledosyası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 -
Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.
source ~/.bash_profile -
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
-
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" -
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
-
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) -
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.
Ö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,UnknownHostveyaSocketException.InvalidResponsedışındaki bir hata koduyla birOSSExceptionö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ü
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 |
Form yükleme (OSS Java SDK V1) Not PostObject uygulaması Java SDK'ya bağlı değildir. | |
Aynı ada sahip dosyanın üzerine yazılmasını önleme (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.
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.
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
-
RAM kullanıcısının AccessKey çiftini kullanarak ortam değişkenlerini yapılandırın.
Linux
-
Komut satırı arayüzünde aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını
~/.bashrcdosyasına ekleyin.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.
source ~/.bashrc -
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
-
Varsayılan kabuk türünü görüntülemek için terminalde aşağıdaki komutu çalıştırın.
echo $SHELL -
Varsayılan kabuk türüne göre aşağıdaki işlemleri gerçekleştirin.
Zsh
-
Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını
~/.zshrcdosyasına ekleyin.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.
source ~/.zshrc -
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
-
Aşağıdaki komutları çalıştırarak ortam değişkeni ayarlarını
~/.bash_profiledosyası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 -
Değişiklikleri uygulamak için aşağıdaki komutu çalıştırın.
source ~/.bash_profile -
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
-
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" -
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
-
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) -
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)
-
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.
-
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.
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.
OpenAPI aracılığıyla hızlı bir şekilde STS belirteci almak için bkz. AssumeRole - RAM rolü için geçici kimlik bilgilerini alma.
SDK kullanarak STS belirteci almak için bkz. OSS'e erişmek için STS belirteci kullanma.
STS belirteci oluştururken bir sona erme süresi belirtmelisiniz. Belirtecin süresi dolduktan sonra geçersiz hale gelir ve kullanılamaz.
STS hizmeti uç noktalarının listesi için bkz. Hizmet uç noktaları.
Ortam değişkenleri
-
Geçici kimlik bilgilerini kullanarak ortam değişkenlerini ayarlayın.
Mac OS/Linux/Unix
ÖnemliBurada 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
ÖnemliBurada 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> -
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.
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.
-
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> -
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.
-
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> -
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.
-
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> -
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.
-
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> -
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.
-
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" }
-
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> -
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.
-
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> -
secretsmanager.propertiesyapı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>"}] -
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.
-
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> -
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 moreveya
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:treekomutunu ç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.xmldosyası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 moreveya
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 moreveya
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder at com.aliyun.oss.internal.ResponseParsers.getXmlRootElement(ResponseParsers.java:645) at … … at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:471) at com.aliyun.oss.OSSClient.doesBucketExist(OSSClient.java:465) at com.aliyun.oss.demo.HelloOSS.main(HelloOSS.java:82) Caused by: java.lang.ClassNotFoundException: org.jdom.input.SAXBuilder at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 11 moreOSS 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
-classpathveya-cpkomutunu 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 verix-oss-meta-authorolarak 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 pidkomutunu ç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 OSSClientişleminin birden çok kez yürütülmüş ancakossClient.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 OSSClientişlemi tamamlandıktan sonra kapatmak içinshutdownyöntemini çağırın.new OSSClientveossClient.shutdowniş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><lossName/><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
callbackparametresi yanlışlıklafileparametresinin 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/jsonBu 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?
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.
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.