![](/img/trans.png)
[英]How to resolve the error: java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: io/vertx/core/Promise
[英]MS Graph (3.0) Java ClientCredentials Error (java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: reactor/netty/tcp/ProxyProvider$TypeSpec)
應用程序類型: Java Spring 使用客戶端憑據流的引導守護程序應用程序。
我之前使用 microsoft-graph 2.10.0 從 Microsoft graph 中獲取數據。 但是,對於最近的 microsoft-graph 3.0.0,我想更新該項目。
在升級和身份驗證詳細信息之后,我使用以下內容使用 ClientCredentials azure-identity 獲取 GraphServiceClient:
String proxyUrl = "xxxxx";
int proxyPort = 8080;
ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP,new InetSocketAddress(proxyUrl, proxyPort));
// proxyOptions.setCredentials(proxyUser, proxyPassword);
final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
.clientId(this.clientId).clientSecret(this.clientSecret).tenantId(this.tenantId)
.httpClient(HttpClient.createDefault(new HttpClientOptions().setProxyOptions(proxyOptions))).build();
final TokenCredentialAuthProvider authProvider = new TokenCredentialAuthProvider(this.scopes, clientSecretCredential);
final GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(authProvider)
.buildClient();
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- exclude logback , add log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- Microsoft Graph -->
<dependency>
<groupId>com.microsoft.graph</groupId>
<artifactId>microsoft-graph</artifactId>
<version>3.0.0</version>
</dependency>
<!-- For SMTP Email -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
<scope>runtime</scope>
</dependency>
<!-- SQL -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
注意:使用 2.10.0 我曾經使用 JVM arguments 來傳遞代理,但是使用 3.0.0 也無法使用,因此最終使用了鏈接下面的 proxyOptions。
問題:在獲取任何數據時收到以下錯誤,在上面的代碼中設置 httpClient 時會看到錯誤。
2021-03-22T16:04:18,295 ERROR [restartedMain] o.s.b.SpringApplication: Application run failed
java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: reactor/netty/tcp/ProxyProvider$TypeSpec
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.lambda$build$7(NettyAsyncHttpClientBuilder.java:142)
at reactor.netty.http.client.HttpClient.tcpConfiguration(HttpClient.java:1343)
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.build(NettyAsyncHttpClientBuilder.java:122)
at com.azure.core.http.netty.NettyAsyncHttpClientProvider.createInstance(NettyAsyncHttpClientProvider.java:32)
at com.azure.core.implementation.http.HttpClientProviders.createInstance(HttpClientProviders.java:48)
at com.azure.core.http.HttpClient.createDefault(HttpClient.java:50)
at com.app.intune.config.GraphClient.getGraphServiceClient(GraphClient.java:48)
at com.app.intune.util.UserUtil.getUsersWithRegisteredDevicesAndSave(UserUtil.java:140)
at com.app.intune.IntuneApplication.run(IntuneApplication.java:61)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:788)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:333)
at com.app.intune.IntuneApplication.main(IntuneApplication.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.NoClassDefFoundError: reactor/netty/tcp/ProxyProvider$TypeSpec
... 18 more
Caused by: java.lang.ClassNotFoundException: reactor.netty.tcp.ProxyProvider$TypeSpec
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 18 more
對上述任何幫助將不勝感激。
更新 1:似乎 Spring 引導依賴項正在管理 okhttp3.version。 將屬性更新到下面后,錯誤已解決。
<properties>
<java.version>1.8</java.version>
<okhttp3.version>4.9.1</okhttp3.version>
</properties>
但是現在有新的錯誤:
java.lang.NoClassDefFoundError: reactor/netty/channel/BootstrapHandlers
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.lambda$build$4(NettyAsyncHttpClientBuilder.java:139)
at reactor.netty.tcp.TcpClient.bootstrap(TcpClient.java:144)
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.lambda$build$7(NettyAsyncHttpClientBuilder.java:138)
at reactor.netty.http.client.HttpClient.tcpConfiguration(HttpClient.java:1343)
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.build(NettyAsyncHttpClientBuilder.java:122)
at com.app.intune.config.GraphClient.getGraphServiceClient(GraphClient.java:43)
at com.app.intune.util.UserUtil.getUsersWithRegisteredDevicesAndSave(UserUtil.java:140)
at com.app.intune.IntuneApplication.run(IntuneApplication.java:57)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:788)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:333)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298)
at com.app.intune.IntuneApplication.main(IntuneApplication.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.ClassNotFoundException: reactor.netty.channel.BootstrapHandlers
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 19 more
對於面臨此問題的任何人,以下是一個解決方案:項目詳細信息:
Spring 啟動 2.4.4
微軟圖 3.0.0
使用以下創建 GraphClient:
final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
.clientId(<clientId>)
.clientSecret(<clientSecret>)
.tenantId(<tenantId>)
.httpClient(new NettyAsyncHttpClientBuilder().proxy(
new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<proxyHost>", <proxyPort>))
.setCredentials("<proxyUser>","<proxyPassword>"))
.build())
.build();
final TokenCredentialAuthProvider tokenCredentialAuthProvider = new TokenCredentialAuthProvider(this.scopes, clientSecretCredential);
final GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(tokenCredentialAuthProvider).buildClient();
您可能會收到其他錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError: reactor/netty/channel/BootstrapHandlers
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.lambda$build$4(NettyAsyncHttpClientBuilder.java:139)
at reactor.netty.tcp.TcpClient.bootstrap(TcpClient.java:187)
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.lambda$build$7(NettyAsyncHttpClientBuilder.java:138)
at reactor.netty.http.client.HttpClient.tcpConfiguration(HttpClient.java:1466)
at com.azure.core.http.netty.NettyAsyncHttpClientBuilder.build(NettyAsyncHttpClientBuilder.java:122)
at com.app.graph_test.App.main(App.java:43)
Caused by: java.lang.ClassNotFoundException: reactor.netty.channel.BootstrapHandlers
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
上述問題發生為 microsoft-graph: 3.0.0 具有以下依賴關系樹:
microsoft-graph : 3.0.0
- microsoft-graph-core : 2.0.0
- azure-identity :1.2.3
- azure-core-http-netty : 1.8.0
- reactor-netty : 0.9.15.RELEASE
Spring boot 2.4.4 有托管依賴,因此它包括以下版本:
reactor-core : 3.4.4
reactor-netty : 1.0.5
新版本的 reactor-netty 不適用於 microsoft-graph 3.0。 因此,通過在 pom.xml 中添加以下內容來手動覆蓋它。
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>0.9.15.RELEASE</version>
</dependency>
發布這個應該沒有錯誤。
我花了很長時間才找到解決這個問題的方法。 我正在使用 spring 啟動 2.2.x 和 MS Graph SDK 版本 5.33.0。 我無法更新我的 spring 引導版本,因為這會導致我的應用程序的其他組件出現問題。 最后,我能夠解決這個問題,使用這個 GitHub 鏈接: https://github.com/Azure/azure-sdk-for-java/issues/17986 。
我必須在我的 pom 的屬性部分添加以下內容:
<reactor-bom.version>2020.0.6</reactor-bom.version>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.