Я только что вернулся к старому 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
Хорошее предложение! Вот что я вижу для Guice. Я почти уверен, что все выглядит нормально, но, пожалуйста, дайте мне знать, если заметите что-то не так! Единственное, о чем я могу думать, это то, что две зависимости имеют Guice, но обе, похоже, используют версию 7, поэтому я думаю, что мне следует быть в курсе... (ОБНОВЛЕНО ГЛАВНОЕ СООБЩЕНИЕ ^^)
Короткий ответ: используйте/примените 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.
.
Вы запускали
sbt dependencyTree
, чтобы определить версии/версии Guice и, возможно, конфликты?