Играть! 3.0 NoSuchMethodError: 'com.google.inject.Provider com.google.inject.util.Providers.guicify(javax.inject.Provider)'

Я только что вернулся к старому Play! мой фреймворк-проект, который стартовал в версии 2.6.0 и был обновлен до версии 3.0.2

Исправив ошибки и обновив проект для компиляции, я запустил его! Однако когда я нажимаю localhost:9000, я сразу получаю ошибку времени выполнения:

NoSuchMethodError: 'com.google.inject.Provider com.google.inject.util.Providers.guicify(javax.inject.Provider)'
play.api.inject.guice.GuiceableModuleConversions$$anon$4.$anonfun$configure$3(GuiceInjectorBuilder.scala:376)
     scala.Option.foreach(Option.scala:437)
     play.api.inject.guice.GuiceableModuleConversions$$anon$4.$anonfun$configure$2(GuiceInjectorBuilder.scala:375)
     play.api.inject.guice.GuiceableModuleConversions$$anon$4.$anonfun$configure$2$adapted(GuiceInjectorBuilder.scala:372)
     scala.collection.immutable.List.foreach(List.scala:334)
...
org.apache.pekko.stream.impl.fusing.MapAsyncUnordered$$anon$31.onPush(Ops.scala:1443)
...
org.apache.pekko.dispatch.Mailbox.exec(Mailbox.scala:253)
...
java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

Я уже несколько дней ломаю голову над этим, в основном делая такие вещи, как:

  • Обновление/изменение версии Scala. Сейчас на 3.3.3

  • Очистка ~/.ivy2 и ~/Library/Caches/Coursier/v1/https/repo1.maven.org

  • build.sbt настройки

Вот мой build.sbt

name := """my-api"""
organization := "DEV LLC"

version := "1.0-SNAPSHOT"

scalaVersion := "3.3.3"

resolvers += "Typesafe Repository" at "https://mvnrepository.com/artifact/com.typesafe.akka/akka-stream"

libraryDependencies += filters
libraryDependencies += jdbc
libraryDependencies += ws
libraryDependencies += guice
// libraryDependencies += "com.google.inject" % "guice" % "4.2.0"
// libraryDependencies += "com.google.inject" % "guice" % "7.0.0"
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.24"
libraryDependencies += "org.json4s" %% "json4s-native" % "4.0.7"
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "7.0.0" % "test"
libraryDependencies += "org.docx4j" % "docx4j-export-fo" % "3.3.0"
libraryDependencies += "org.jsoup" % "jsoup" % "1.9.2"
libraryDependencies += "com.github.nscala-time" %% "nscala-time" % "2.32.0"
libraryDependencies += "com.google.firebase" % "firebase-admin" % "5.9.0"
libraryDependencies += "net.codingwell" %% "scala-guice" % "7.0.0"
libraryDependencies += "org.apache.commons" % "commons-email" % "1.5"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

Моя теория заключалась в том, что Play! пытается вызвать guicify во время выполнения для динамически загружаемого объекта и терпит неудачу с исключением NoSuchMethod, что означает, что установленная мной версия Guice не должна быть правильной версией.

Если эта теория верна, то я все еще в недоумении, потому что я убедился, что у меня установлена ​​версия Guice 7.0 ~/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/com/google/inject/guice/7.0.0 и метод guicify был добавлен в 4.x

Ищу любую помощь или предложения о том, как двигаться вперед, поскольку я в тупике!

Обновлено: Вот результат sbt dependencyTree

+-org.playframework:play-guice_3:3.0.2
[info]   | +-com.google.inject.extensions:guice-assistedinject:6.0.0
[info]   | | +-com.google.errorprone:error_prone_annotations:2.18.0 (evicted by: 2.21..
[info]   | | +-com.google.errorprone:error_prone_annotations:2.21.1
[info]   | | +-com.google.inject:guice:6.0.0 (evicted by: 7.0.0)
[info]   | | +-com.google.inject:guice:7.0.0
[info]   | |   +-aopalliance:aopalliance:1.0
[info]   | |   +-com.google.guava:guava:31.0.1-jre (evicted by: 32.1.3-jre)
[info]   | |   +-com.google.guava:guava:32.1.3-jre
[info]   | |   | +-com.google.code.findbugs:jsr305:3.0.2
[info]   | |   | +-com.google.errorprone:error_prone_annotations:2.21.1
[info]   | |   | +-com.google.guava:failureaccess:1.0.1
[info]   | |   | +-com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-w..
[info]   | |   | +-com.google.j2objc:j2objc-annotations:2.8
[info]   | |   | +-org.checkerframework:checker-qual:3.37.0
[info]   | |   | 
[info]   | |   +-jakarta.inject:jakarta.inject-api:2.0.1
[info]   | |   
[info]   | +-com.google.inject:guice:6.0.0 (evicted by: 7.0.0)
[info]   | +-com.google.inject:guice:7.0.0


+-net.codingwell:scala-guice_3:7.0.0
[info]   | +-com.google.inject:guice:7.0.0

Вы запускали sbt dependencyTree, чтобы определить версии/версии Guice и, возможно, конфликты?

Gaël J 05.05.2024 21:19

Хорошее предложение! Вот что я вижу для Guice. Я почти уверен, что все выглядит нормально, но, пожалуйста, дайте мне знать, если заметите что-то не так! Единственное, о чем я могу думать, это то, что две зависимости имеют Guice, но обе, похоже, используют версию 7, поэтому я думаю, что мне следует быть в курсе... (ОБНОВЛЕНО ГЛАВНОЕ СООБЩЕНИЕ ^^)

xinu3 06.05.2024 01:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Короткий ответ: используйте/примените Guice 6.x в своем пути к классам. На данный момент Play использует версию 6.x и еще не совместим с 7.x.

Понижения scala-guice до 6.x должно быть достаточно.


Вы получаете сообщение о том, что метод не существует. Важно знать, что вся сигнатура должна быть «совместимой», чтобы метод считался существующим.

Тем более здесь метода com.google.inject.util.Providers.guicify(javax.inject.Provider) действительно не существует. Но com.google.inject.util.Providers.guicify(jakarta.inject.Provider) так и есть.

Это связано с серьезными изменениями в экосистеме Java (EE, теперь Jakarta), вынудившими переименовать некоторые пакеты.

Guice, опираясь на эти пакеты, выпустила две версии, поддерживающие то или иное имя:

  • 6.0.0 (поддерживает javax.{inject,servlet,persistence}, в основном поддерживает jakarta.inject)
  • 7.0.0 (поддерживает Джакарту.{inject,servlet,persistence})
  • (6.0.0 и 7.0.0 эквивалентны, за исключением поддержки javax/jakarta.)

Версия Guice 7.x больше не поддерживает пакеты javax..

Другие вопросы по теме