Azure-尝试从keyVault获取密钥时,ApplicationTokenCredential中出现NoSuchMethodExist错误

时间:2018-07-04 03:52:52

标签: java azure azure-eventhub azure-keyvault

我正试图通过这种方式获取密钥:

private static String getPolicyKey(String secretName, String keyVaultUrl, String applicationId, String applicationSecret) {
  KeyVaultClient keyVaultClient = new KeyVaultClient(new ApplicationTokenCredentials(
        applicationId,          // Application ID
        "myDomain.com",                                 // Azure Active Directory Domain
        applicationSecret,  // Application Key Value
        AzureEnvironment.AZURE
  ));

  return keyVaultClient.getSecret(
        keyVaultUrl,        // KeyValut URL
        secretName   // Secret Name
  ).value();
}

但是我得到一个例外:

java.lang.NoSuchMethodError: com.microsoft.azure.credentials.ApplicationTokenCredentials.proxy()Ljava/net/Proxy;

at com.microsoft.azure.credentials.ApplicationTokenCredentials.acquireAccessToken(ApplicationTokenCredentials.java:137)
at com.microsoft.azure.credentials.ApplicationTokenCredentials.getToken(ApplicationTokenCredentials.java:127)
at com.microsoft.azure.credentials.AzureTokenCredentials.getToken(AzureTokenCredentials.java:39)
at com.microsoft.azure.credentials.AzureTokenCredentialsInterceptor.intercept(AzureTokenCredentialsInterceptor.java:36)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
at okhttp3.RealCall.execute(RealCall.java:57)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
at rx.Subscriber.setProducer(Subscriber.java:211)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
at rx.Observable.unsafeSubscribe(Observable.java:10142)

我正在使用以下依赖项:

        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-eventhubs</artifactId>
            <version>0.15.1</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-keyvault</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-client-authentication</artifactId>
            <version>1.1.0</version>
        </dependency>

注意:我尝试使用azure-eventhubs版本1.0.1,但即使这样也会产生相同的错误。

这是我第一次处理azure-eventhub,对此的任何指导都将非常有帮助。

1 个答案:

答案 0 :(得分:0)

在 Maven 中,当您在相同距离(或深度)的多个直接依赖项之间共享传递依赖项时,最终出现在您的依赖项树中的依赖项将是来自第一个直接依赖项(按出现顺序)。

由于 com.microsoft.azure:azure-keyvault:1.0.0 首先出现在您的 POM 中,项目最终将使用 1.0.0com.microsoft.azure:azure-client-runtime 版本,这是包含 proxy() 方法的类所在的位置.问题是这个方法被引入到版本1.1.0

您在这里可以做的是交换 Azure Key Vault 和 Azure 客户端身份验证依赖项的出现顺序。您可以做的另一件事是直接声明要在 POM 中使用的 azure-client-runtime 版本:

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-client-runtime</artifactId>
    <version>1.1.0</version>
</dependency>