【问题标题】:AmazonS3Client will not connectAmazonS3Client 将无法连接
【发布时间】:2015-11-18 12:04:09
【问题描述】:

我正在尝试连接到我的 AWS S3 存储桶以按照这些链接的说明上传文件。


http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpJava.html http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/credentials.html#credentials-specify-provider


由于某种原因,当它尝试实例化 AmazonS3Client 对象时,它会抛出一个正在被吞噬的异常,并退出我的 Struts Action。因此,我没有太多可以调试的信息。

我尝试了 默认凭据配置文件 (~/.aws/credentials) 方法和显式密钥和访问密钥(new BasicAWSCredentials(access_key_id, secret_access_key)

/**
 * Uses the secret key and access key to return an object for accessing AWS features
 * @return BasicAWSCredentials
 */
public static BasicAWSCredentials getAWSCredentials() {
    final Properties props = new Properties();
    try {
        props.load(Utils.class.getResourceAsStream("/somePropFile"));
        BasicAWSCredentials credObj = new BasicAWSCredentials(props.getProperty("accessKey"), 
                props.getProperty("secretKey"));
        return credObj;
    }  catch (IOException e) {
        log.error("getAWSCredentials IOException" + e.getMessage());
        return null;
    }
    catch (Exception e) {
        log.error("getAWSCredentials Exception: " + e.getMessage());
        e.printStackTrace();
        return null;
    }
}

********* 代码尝试 S3 访问 **********

try {
        AmazonS3 s3client = new AmazonS3Client(Utils.getAWSCredentials());
        //AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
        String fileKey = "catering/" + catering.getId() + fileUploadsFileName.get(i);

        System.out.println("Uploading a new object to S3 from a file\n");
        s3client.putObject(new PutObjectRequest(
                                                 Utils.getS3BucketName(), 
                                                 fileKey, file));
        // Save Attachment record
        Attachment newAttach = new Attachment();
        newAttach.setFile_key(fileKey);
        newAttach.setFilename(fileUploadsFileName.get(i));
        newAttach.setFiletype(fileUploadsContentType.get(i));
        newAttach = aDao.add(newAttach);

} catch (AmazonServiceException ase) {
        System.out.println("Caught an AmazonServiceException, which " +
                                "means your request made it " +
                                "to Amazon S3, but was rejected with an error response" +
                                " for some reason.");
        System.out.println("Error Message:    " + ase.getMessage());
        System.out.println("HTTP Status Code: " + ase.getStatusCode());
        System.out.println("AWS Error Code:   " + ase.getErrorCode());
        System.out.println("Error Type:       " + ase.getErrorType());
        System.out.println("Request ID:       " + ase.getRequestId());
        fileErrors.add(fileUploadsFileName.get(i));
    } catch (AmazonClientException ace) {
        System.out.println("Caught an AmazonClientException, which " +
                                "means the client encountered " +
                                "an internal error while trying to " +
                                "communicate with S3, " +
                                "such as not being able to access the network.");
        System.out.println("Error Message: " + ace.getMessage());
        fileErrors.add(fileUploadsFileName.get(i));
    } catch(Exception e) {
    System.out.println("Error Message: " + e.getMessage());
}

它永远不会超过AmazonS3 s3client = new AmazonS3Client(Utils.getAWSCredentials()); 行。我已验证 BasicAWSCredentials 对象包含正确的字段值。根据此信息,阻止 S3 客户端连接可能会出现什么问题?

** 编辑 **


我在生成的堆栈跟踪中发现这似乎是有用的信息:

org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745) 引起: java.lang.NoClassDefFoundError:无法初始化类 com.amazonaws.ClientConfiguration 在 com.amazonaws.services.s3.AmazonS3Client.(AmazonS3Client.java:384) 在 gearup.actions.CateringController.assignAttachments(CateringController.java:176) 在 gearup.actions.CateringController.update(CateringController.java:135)

之前我尝试了一个创建 ClientConfiguration 对象并将协议设置为 HTTP 的演示。但是我遇到了一个问题,调用 new ClientConfiguration(); 构造函数会引发 NullPointerException。我在这里遗漏了一些要求吗?

【问题讨论】:

  • 抛出的异常中的错误信息是什么?
  • @Brayden 请在上面查看我的编辑

标签: java amazon-web-services amazon-s3


【解决方案1】:

您的项目似乎缺少一些依赖项。

您显然在项目中配置了 aws-java-sdk-s3 jar,因为它正在解析 AmazonS3Client,但此 jar 还依赖于 aws-java-sdk-core。您需要将核心 jar 添加到类路径中。

【讨论】:

  • 我能够按照您的建议通过包含aws-java-sdk-core 以及添加Java SDK 下载随附的所有必需的第三方jar 来使其正常工作。非常感谢您的帮助。
  • 我已经添加了他们两个,但我仍然看到这个异常,任何线索可能是错误的?
【解决方案2】:

这很奇怪,因为aws-java-sdk-s3 明确依赖于aws-java-sdk-core(参见pom.xml)。这里有些可疑。
对我来说,事实证明这是 apache httpclient 版本的冲突(我的一个 POM 中的版本比亚马逊库使用的版本旧)。
我从其他人那里听说过类似的冲突,例如jackson.

因此,对于遇到这种情况的任何人,我建议您在 Eclipse 中打开 POM.xml 时检查 Dependency hierarchy(或使用 mvn dependency:tree。有关详细信息,请参阅 here)。

另外,检查 AWS 抛出的第一条错误消息。似乎在所有进一步的堆栈跟踪中都没有将其链接为原因,它只会告诉您类似 java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.http.AmazonHttpClient 的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2016-01-16
    • 2020-11-22
    • 2017-03-24
    相关资源
    最近更新 更多