Я работаю над новым проектом на основе Java 21, который использует последнюю версию болта «1.39.3» для зависимостей com.slack.api:bolt
, com.slack.api:bolt-servlet
, com.slack.api:bolt-socket-mode
.
Я получаю следующую трассировку стека
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'slackApp' defined in class path resource [com/rakuten/microservice/infra/configuration/SlackAppConfiguration.class]: Failed to instantiate [com.slack.api.bolt.App]: Factory method 'slackApp' threw exception with message: javax/websocket/DeploymentException
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:648)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1337)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1167)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
at com.rakuten.microservice.MicroserviceApplication.main(MicroserviceApplication.java:10)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.slack.api.bolt.App]: Factory method 'slackApp' threw exception with message: javax/websocket/DeploymentException
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:177)
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644)
... 22 common frames omitted
Caused by: java.lang.NoClassDefFoundError: javax/websocket/DeploymentException
at com.slack.api.Slack.socketMode(Slack.java:174)
at com.slack.api.bolt.socket_mode.SocketModeApp.lambda$buildSocketModeClientFactory$2(SocketModeApp.java:76)
at com.slack.api.bolt.socket_mode.SocketModeApp.run(SocketModeApp.java:187)
at com.slack.api.bolt.socket_mode.SocketModeApp.start(SocketModeApp.java:177)
at com.rakuten.microservice.infra.configuration.SlackAppConfiguration.slackApp(SlackAppConfiguration.java:22)
at com.rakuten.microservice.infra.configuration.SlackAppConfiguration$$SpringCGLIB$$0.CGLIB$slackApp$0(<generated>)
at com.rakuten.microservice.infra.configuration.SlackAppConfiguration$$SpringCGLIB$$FastClass$$1.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:339)
at com.rakuten.microservice.infra.configuration.SlackAppConfiguration$$SpringCGLIB$$0.slackApp(<generated>)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140)
... 23 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.websocket.DeploymentException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 36 common frames omitted
Похоже, что Bolt ищет классы javax
и поэтому несовместим с Java 21 (которая имеет пространство имен jakarta
).
Верно ли мое понимание? Как мне работать с Bolt и Java 21?
Следуя их официальной документации со ссылками на Примеры приложений с Spring Boot и далее пример кода для spring-boot-3
в build.gradle. Я мог бы разобраться и убедиться, что вам нужна зависимость (совместное использование конструкции Maven):
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>bolt-jakarta-servlet</artifactId>
<version>1.39.3</version>
</dependency>
Цитируя далее из bolt-socket-mode , необходимые зависимости будут следующими:
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>bolt</artifactId>
<version>1.39.3</version>
</dependency>
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>bolt-socket-mode</artifactId>
<version>1.39.3</version>
</dependency>
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version> <!-- this should help you-->
</dependency>
<dependency>
<groupId>org.glassfish.tyrus.bundles</groupId>
<artifactId>tyrus-standalone-client</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
@ArnaudJeansen Обновил ответ, добавив соответствующие зависимости, необходимые для режима болта-гнезда.
Спасибо @naman, я выбрал другую реализацию веб-сокета: SocketModeApp socketModeApp = new SocketModeApp(slackAppProperties.getAppToken(), SocketModeClient.Backend.JavaWebSocket, app);
С зависимостями com.slack.api:bolt-jakarta-servlet
, com.slack.api:bolt-socket-mode
, org.java-websocket:Java-WebSocket:1.4.1
я также исключил javax.websocket:javax.websocket-api
из режима сокета, на всякий случай. Теперь все начинается правильно. Большое спасибо!
Спасибо, что изучили это. Я предполагаю, что это устраняет зависимость болт-сервлета
javax
, ноbolt-socket-mode
также напрямую зависит от javax.websocket » javax.websocket-api, см. mvnrepository.com/artifact/com.slack.api/bolt-socket-mode/…