Исключение java .lang.NoSuchMethodError, генерируемое при вызове Azure API, связанного с хранилищем java - PullRequest
0 голосов
/ 08 марта 2020

Оставьте тему здесь для тех, кто может столкнуться с такими же проблемами.


Я пытаюсь прочитать blob из Azure container по следующему коду:

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 в качестве инструмента для сборки.

Что здесь происходит?

1 Ответ

0 голосов
/ 08 марта 2020

Я наконец нашел решение, и оно о конфликте зависимостей maven. Более чем одна зависимость зависит от netty в разных версиях.

Я добавил зависимость aws и azure в maven, как показано ниже:

<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>

Используя инструмент maven mvn dependency:tree, я получил вывод следующим образом:

[INFO] |  +- com.amazonaws:aws-java-sdk-kinesisvideo:jar:1.11.327:compile
[INFO] |  |  +- io.netty:netty-codec-http:jar:4.1.17.Final:compile
[INFO] |  |  |  \- io.netty:netty-codec:jar:4.1.17.Final:compile
[INFO] |  |  \- io.netty:netty-handler:jar:4.1.17.Final:compile
[INFO] |  |     +- io.netty:netty-buffer:jar:4.1.17.Final:compile
[INFO] |  |     |  \- io.netty:netty-common:jar:4.1.17.Final:compile
[INFO] |  |     \- io.netty:netty-transport:jar:4.1.17.Final:compile
[INFO] |  |        \- io.netty:netty-resolver:jar:4.1.17.Final:compile
[INFO] |  \- com.azure:azure-storage-common:jar:12.0.0:compile
[INFO] |     \- com.azure:azure-core-http-netty:jar:1.0.0:compile
[INFO] |        +- io.netty:netty-handler-proxy:jar:4.1.42.Final:compile
[INFO] |        |  \- io.netty:netty-codec-socks:jar:4.1.42.Final:compile
[INFO] |        +- io.projectreactor.netty:reactor-netty:jar:0.9.0.RELEASE:compile
[INFO] |        |  +- io.netty:netty-codec-http2:jar:4.1.39.Final:compile
[INFO] |        |  +- io.netty:netty-transport-native-epoll:jar:linux-x86_64:4.1.39.Final:compile
[INFO] |        |  |  \- io.netty:netty-transport-native-unix-common:jar:4.1.39.Final:compile
[INFO] |        |  \- io.projectreactor.addons:reactor-pool:jar:0.1.0.RELEASE:compile
[INFO] |        \- com.azure:azure-core-test:jar:1.0.0:compile
[INFO] |           \- io.projectreactor:reactor-test:jar:3.3.0.RELEASE:compile

Как мы видим, azure и aws зависели от netty, а версия netty отличается. Таким образом, вопрос заключается в разрешении конфликта.

Согласно введению из maven ,

Поскольку Maven разрешает зависимости транзитивно, нежелательные зависимости могут быть включены в путь к классам вашего проекта. Например, некоторые старые jar могут иметь проблемы с безопасностью или быть несовместимыми с версией Java, которую вы используете. Чтобы решить эту проблему, Maven позволяет исключить определенные c зависимости. Исключения устанавливаются на указанную c зависимость в вашем POM и нацелены на определенный groupId и artifactId. Когда вы создаете свой проект, этот артефакт не будет добавлен в путь к классам вашего проекта из-за зависимости, в которой было объявлено исключение.

Нам нужно исключить netty 4.1.17, чтобы он не будет добавлен в classpath проекта и явно не установит 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 будет работать нормально.

...