我正在开发一个 Spring Boot 应用程序,我在其中集成了 Amazon S3 服务。
此类是我访问 S3 存储桶的存储库:
public class S3FileRepository implements ImageRepository {
private String bucket;
private AmazonS3 s3Client;
private ResourceLoader resourceLoader;
public S3FileRepository(ResourceLoader resourceLoader, AmazonS3 s3Client, String bucket) {
this.resourceLoader = resourceLoader;
this.s3Client = s3Client;
this.bucket = bucket;
}
private static String toS3Uri(String bucket, String imageName) {
return String.format("s3://%s/%s", bucket, imageName);
}
@Override
public Resource getImage(String name) {
return resourceLoader.getResource(S3FileRepository.toS3Uri(this.bucket, name).concat(this.IMAGE_EXTENSION));
}
按照建议使用Spring Boot Autoconfiguration。
所以在我的pom.xml
,除其他外,我已经
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-autoconfigure</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-context</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
此外,我做了application.properties
这样的事情:
cloud.aws.credentials.accessKey= (mykey)
cloud.aws.credentials.secretKey= (mysecret)
cloud.aws.credentials.instanceProfile=true
cloud.aws.region.static=eu-west-2
cloud.aws.stack.auto=false
问题:
如果我编译我的项目,然后我只需运行 JAR java -jar target/myproject.jar
,一切正常,我正确地得到了我要求的图像,一切都很好。
相反,如果我在尝试获取图像(存在于存储桶中)时使用IDE 默认运行项目,则会出现以下异常: mvn spring-boot:run
ServletContext resource [/s3://mybucket/test.jpeg] cannot be resolved to URL because it does not exist
java.io.FileNotFoundException: ServletContext resource [/s3://mybucket/test.jpeg] cannot be resolved to URL because it does not exist
所以我认为它抛出了一个异常,因为它就像它进入 jar来寻找匹配的东西,s3://mybucket/test.jpeg
但我不明白为什么,以及为什么它只运行项目mvn spring-boot:run
而不运行 jar。