调用Azure存储相关java API时引发异常java.lang.NoSuchMethodError
将此线程留给可能遇到相同问题的其他人 我正试图通过以下代码从Azure容器中读取blob:调用Azure存储相关java API时引发异常java.lang.NoSuchMethodError,java,amazon-web-services,azure,maven,netty,Java,Amazon Web Services,Azure,Maven,Netty,将此线程留给可能遇到相同问题的其他人 我正试图通过以下代码从Azure容器中读取blob: public static void main(String[] args) { String connectStr = "it's a workable connection string..."; // Create a BlobServiceClient object which will be used to create a container client BlobSe
public static void main(String[] args) {
String connectStr = "it's a workable connection string...";
// Create a BlobServiceClient object which will be used to create a container client
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient();
String containerName = "eugenecontainer";
BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(containerName);
for (BlobItem blobItem: blobContainerClient.listBlobs()){
System.out.println(blobItem.getName());
}
}
但是,当它执行blobContainerClient.listBlobs时,会引发以下异常:
Exception in thread "main" java.lang.NoSuchMethodError: io.netty.bootstrap.Bootstrap.config()Lio/netty/bootstrap/BootstrapConfig;
我使用maven作为构建工具
这里发生了什么?我终于找到了解决方案,它是关于maven依赖冲突的。不同版本中有多个依赖项依赖于netty 我在maven中添加了aws和azure依赖项,如下所示:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.327</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.0.0</version>
</dependency>
正如我们所看到的,azure和aws确实依赖于netty,而netty的版本是不同的。因此,问题在于解决冲突
据介绍,
由于Maven以传递方式解析依赖项,因此
要包含在项目类路径中的不需要的依赖项。对于
例如,某个较旧的jar可能存在安全问题或
与您正在使用的Java版本不兼容。为了解决这个问题,,
Maven允许您排除特定的依赖项。排除已设置
在POM中的特定依赖项上,并针对特定的
groupId和artifactId。当您构建项目时,该工件
不会通过依赖关系添加到项目的类路径
其中宣布了排除
我们需要排除netty 4.1.17,这样它就不会被添加到项目的类路径中,并显式地将netty设置为azure
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.327</version>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>io.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.0.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.42.Final</version>
</dependency>
通过将上述依赖项添加到pom.xml,azure可以正常工作 我终于找到了解决方案,它是关于maven依赖冲突的。不同版本中有多个依赖项依赖于netty 我在maven中添加了aws和azure依赖项,如下所示:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.327</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.0.0</version>
</dependency>
正如我们所看到的,azure和aws确实依赖于netty,而netty的版本是不同的。因此,问题在于解决冲突
据介绍,
由于Maven以传递方式解析依赖项,因此
要包含在项目类路径中的不需要的依赖项。对于
例如,某个较旧的jar可能存在安全问题或
与您正在使用的Java版本不兼容。为了解决这个问题,,
Maven允许您排除特定的依赖项。排除已设置
在POM中的特定依赖项上,并针对特定的
groupId和artifactId。当您构建项目时,该工件
不会通过依赖关系添加到项目的类路径
其中宣布了排除
我们需要排除netty 4.1.17,这样它就不会被添加到项目的类路径中,并显式地将netty设置为azure
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.327</version>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>io.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.0.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.42.Final</version>
</dependency>
通过将上述依赖项添加到pom.xml,azure可以正常工作 如果您使用的是如下所述的spring引导依赖项,请排除azure core http netty,并为azure core http okhttp添加新的独立依赖项,如下所示 com.azure.spring azure spring启动存储 com.azure azure核心http netty com.azure azure核心http-okhttp 1.2.1
如果您使用的是如下所述的spring引导依赖项,请排除azure core http netty,并为azure core http okhttp添加新的独立依赖项,如下所示 com.azure.spring azure spring启动存储 com.azure azure核心http netty com.azure azure核心http-okhttp 1.2.1
如果jar已经存在于类路径上,因为它是由服务器在运行时提供的,那么只需告诉maven提供了工件。如果jar已经存在于类路径上,因为它是由服务器在运行时提供的,那么只需告诉maven提供了工件。