在 gradle 构建期间检索 AWS 数据
retrieve AWS data during gradle build
我正在尝试从 AWS 获取一些值(例如从 cognito 或 s3)。我认为合适的是,您在 build.gradle 中定义一个任务,该任务在 gradle 为 运行 时在构建期间执行。我按照文档中的说明进行操作 (https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/creating-clients.html),但是当我尝试使用我导入的 AWS 依赖项中的方法时出现 'cannot resolve symbol' 错误。
这些导入的依赖项遵循教程中给出的示例:
...
dependencies {
implementation platform('software.amazon.awssdk:bom:2.X.X')
implementation 'software.amazon.awssdk:kinesis'
...
}
代码 gradle 内发生错误(例如无法识别 KinesisClient):
def task = {
KinesisClient kinesisClient = KinesisClient.builder()
.region(ARANDROMREGION)
.build();
}
如何在构建期间从 gradle 访问 AWS 值?这是最底层的问题。如果我提供的信息不清楚,请告诉我。
这是使用 Java S3 API 和 build.gradle 文件的完整示例(V1 和 V2)
JAVA V1
这是 S3 Java 代码:
package com.amazon.s3;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CreateBucketRequest;
import com.amazonaws.services.s3.model.GetBucketLocationRequest;
import java.io.IOException;
public class CreateBucket {
public static void main(String[] args) throws IOException {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "My Bucket";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider())
.withRegion(clientRegion)
.build();
if (!s3Client.doesBucketExistV2(bucketName)) {
// Because the CreateBucketRequest object doesn't specify a region, the
// bucket is created in the region specified in the client.
s3Client.createBucket(new CreateBucketRequest(bucketName));
// Verify that the bucket was created by retrieving it and checking its location.
String bucketLocation = s3Client.getBucketLocation(new GetBucketLocationRequest(bucketName));
System.out.println("Bucket location: " + bucketLocation);
}
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it and returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
}
这里是 build.gradle 文件:
plugins {
id 'java'
}
group 'AWSS3_Gra'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.228')
implementation 'com.amazonaws:aws-java-sdk-s3'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
JAVA V2
这里是 S3 Java代码:
package com.example.s3;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.model.S3Object;
import java.util.List;
import java.util.ListIterator;
public class ListObjects {
public static void main(String[] args) {
String bucketName = "BucketName";
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder()
.region(region)
.build();
ListBucketObjects(s3, bucketName);
}
public static void ListBucketObjects( S3Client s3, String bucketName ) {
try {
ListObjectsRequest listObjects = ListObjectsRequest
.builder()
.bucket(bucketName)
.build();
ListObjectsResponse res = s3.listObjects(listObjects);
List<S3Object> objects = res.contents();
for (ListIterator iterVals = objects.listIterator(); iterVals.hasNext(); ) {
S3Object myValue = (S3Object) iterVals.next();
System.out.print("\n The name of the key is " + myValue.key());
System.out.print("\n The object is " + calKb(myValue.size()) + " KBs");
System.out.print("\n The owner is " + myValue.owner());
}
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
//convert bytes to kbs
private static long calKb(Long val) {
return val/1024;
}
}
构建文件是:
group 'aws.test'
version '1.0'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation platform('software.amazon.awssdk:bom:2.10.30')
implementation 'software.amazon.awssdk:s3'
testImplementation group: 'junit', name: 'junit', version: '4.11'
}
希望这对您有所帮助...
PS - 这是 AWS 开发人员指南的 link 以获取此信息:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/setup-project-gradle.html
事实证明,定义依赖项应该在构建脚本中完成,以便在构建期间可以从 gradle 访问它们:
buildscript {
repositories {
...
}
dependencies {
...
classpath 'software.amazon.awssdk:kinesis:VERSION'
}
}
然后你必须在任务之前导入你将要使用的 classes,就像你在 java class 中做的那样,你很高兴去吧。
我正在尝试从 AWS 获取一些值(例如从 cognito 或 s3)。我认为合适的是,您在 build.gradle 中定义一个任务,该任务在 gradle 为 运行 时在构建期间执行。我按照文档中的说明进行操作 (https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/creating-clients.html),但是当我尝试使用我导入的 AWS 依赖项中的方法时出现 'cannot resolve symbol' 错误。
这些导入的依赖项遵循教程中给出的示例:
...
dependencies {
implementation platform('software.amazon.awssdk:bom:2.X.X')
implementation 'software.amazon.awssdk:kinesis'
...
}
代码 gradle 内发生错误(例如无法识别 KinesisClient):
def task = {
KinesisClient kinesisClient = KinesisClient.builder()
.region(ARANDROMREGION)
.build();
}
如何在构建期间从 gradle 访问 AWS 值?这是最底层的问题。如果我提供的信息不清楚,请告诉我。
这是使用 Java S3 API 和 build.gradle 文件的完整示例(V1 和 V2)
JAVA V1 这是 S3 Java 代码:
package com.amazon.s3;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CreateBucketRequest;
import com.amazonaws.services.s3.model.GetBucketLocationRequest;
import java.io.IOException;
public class CreateBucket {
public static void main(String[] args) throws IOException {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "My Bucket";
try {
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withCredentials(new ProfileCredentialsProvider())
.withRegion(clientRegion)
.build();
if (!s3Client.doesBucketExistV2(bucketName)) {
// Because the CreateBucketRequest object doesn't specify a region, the
// bucket is created in the region specified in the client.
s3Client.createBucket(new CreateBucketRequest(bucketName));
// Verify that the bucket was created by retrieving it and checking its location.
String bucketLocation = s3Client.getBucketLocation(new GetBucketLocationRequest(bucketName));
System.out.println("Bucket location: " + bucketLocation);
}
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it and returned an error response.
e.printStackTrace();
} catch (SdkClientException e) {
// Amazon S3 couldn't be contacted for a response, or the client
// couldn't parse the response from Amazon S3.
e.printStackTrace();
}
}
}
这里是 build.gradle 文件:
plugins {
id 'java'
}
group 'AWSS3_Gra'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.228')
implementation 'com.amazonaws:aws-java-sdk-s3'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
JAVA V2
这里是 S3 Java代码:
package com.example.s3;
import software.amazon.awssdk.core.SdkField;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.model.S3Object;
import java.util.List;
import java.util.ListIterator;
public class ListObjects {
public static void main(String[] args) {
String bucketName = "BucketName";
Region region = Region.US_WEST_2;
S3Client s3 = S3Client.builder()
.region(region)
.build();
ListBucketObjects(s3, bucketName);
}
public static void ListBucketObjects( S3Client s3, String bucketName ) {
try {
ListObjectsRequest listObjects = ListObjectsRequest
.builder()
.bucket(bucketName)
.build();
ListObjectsResponse res = s3.listObjects(listObjects);
List<S3Object> objects = res.contents();
for (ListIterator iterVals = objects.listIterator(); iterVals.hasNext(); ) {
S3Object myValue = (S3Object) iterVals.next();
System.out.print("\n The name of the key is " + myValue.key());
System.out.print("\n The object is " + calKb(myValue.size()) + " KBs");
System.out.print("\n The owner is " + myValue.owner());
}
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
}
//convert bytes to kbs
private static long calKb(Long val) {
return val/1024;
}
}
构建文件是:
group 'aws.test'
version '1.0'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
implementation platform('software.amazon.awssdk:bom:2.10.30')
implementation 'software.amazon.awssdk:s3'
testImplementation group: 'junit', name: 'junit', version: '4.11'
}
希望这对您有所帮助...
PS - 这是 AWS 开发人员指南的 link 以获取此信息:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/setup-project-gradle.html
事实证明,定义依赖项应该在构建脚本中完成,以便在构建期间可以从 gradle 访问它们:
buildscript {
repositories {
...
}
dependencies {
...
classpath 'software.amazon.awssdk:kinesis:VERSION'
}
}
然后你必须在任务之前导入你将要使用的 classes,就像你在 java class 中做的那样,你很高兴去吧。