Я пытаюсь написать приложение Play 2.3.8 в Scala, управляя им через sbt, но редактируя его в Eclipse. Я работал вокруг одной проблемы, но это, похоже, вводит другую, и не может решить, как ее решить.NoClassDefFoundError для Play приложение с sbt с использованием Eclipse
Я создал проект, используя точные инструкции Create a new application without Activator (кроме Я также добавить
scalaVersion := "2.11.6"
к build.sbt), то я cd
в мой каталог проекта, типа sbt
и один раз в SBT I типа eclipse
, Затем я открываю Eclipse и счастливо импортирую проект.
Теперь я создаю простой шаблон (app/views/Application/index.scala.html
) и контроллер, который его называет (app/controllers/Application.scala
). Когда я перехожу в sbt и типа run
, я с радостью могу открыть свой веб-браузер на localhost: 9000, и появится мой заполненный шаблон.
Все хорошо, кроме одной проблемы (первая). Когда я открываю Application.scala
в Eclipse, я получаю красную строку ошибки, в которой говорится: «Object Application не является членом пакета views.html». Я решил это, используя Nick Cooper's answer elsewhere on Stack Overflow. Он сказал, чтобы перейти в Project> Properties> Java Build Path> Libraries> Add Class Folder ... и затем добавить target/scala-2.11/classes_managed
. Это заставляет ошибку уйти. Но я не хочу напрямую управлять настройками Eclipse; Я хочу управлять всем через sbt. Так методом проб и ошибок, я обнаружил, что я могу добавить эту строку в мой файл build.sbt ...
unmanagedJars in Compile += (baseDirectory.value/"target/scala-2.11/classes_managed")
... и теперь я могу ввести sbt
затем eclipse
и конфигурации в Eclipse не генерируется правильно, с не Ошибки красной линии.
Но это создает вторую проблему. Оказывается, что, вводя эту строку в build.sbt, приложение больше не работает. В частности, когда я иду в СБТ, тип run
и открытый локального хоста: 9000 Я получаю NoClassDefFoundError
исключение в моей SBT консоли:
java.lang.NoClassDefFoundError: controllers/Application$
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:51) ~[classes_managed/:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:51) ~[classes_managed/:na]
at play.core.Router$HandlerInvokerFactory$$anon$13$$anon$14.call(Router.scala:217) ~[play_2.11-2.3.8.jar:2.3.8]
at play.core.Router$Routes$TaggingInvoker.call(Router.scala:464) ~[play_2.11-2.3.8.jar:2.3.8]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1.apply(routes_routing.scala:51) ~[classes_managed/:na]
Caused by: java.lang.ClassNotFoundException: controllers.Application$
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_40]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_40]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_40]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:51) ~[classes_managed/:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$1$$anonfun$apply$1.apply(routes_routing.scala:51) ~[classes_managed/:na]
[error] application - Error while rendering default error page
scala.MatchError: java.lang.NoClassDefFoundError: controllers/Application$ (of class java.lang.NoClassDefFoundError)
at play.api.GlobalSettings$class.onError(GlobalSettings.scala:148) ~[play_2.11-2.3.8.jar:2.3.8]
at play.api.DefaultGlobal$.onError(GlobalSettings.scala:206) [play_2.11-2.3.8.jar:2.3.8]
at play.core.server.Server$class.logExceptionAndGetResult$1(Server.scala:63) [play_2.11-2.3.8.jar:2.3.8]
at play.core.server.Server$$anonfun$getHandlerFor$4.apply(Server.scala:73) [play_2.11-2.3.8.jar:2.3.8]
at play.core.server.Server$$anonfun$getHandlerFor$4.apply(Server.scala:71) [play_2.11-2.3.8.jar:2.3.8]
Вы можете увидеть the entire (tiny) codebase on Github.
Все файлы классов, кажется, все находятся там и в точно таких же местах, независимо от того, включена ли строка «неуправляемые линии». Это не проблема Eclipse, потому что это происходит даже при закрытии Eclipse. Кажется, это проблема с classpath (но я не понимаю, почему добавление в classpath должно скрыть некоторые классы). Независимо от этого, я хотел бы управлять своим проектом с помощью sbt и использовать Eclipse так же, как и редактор. Что я ошибаюсь?
_Nick Cooper's_ ссылка не работает – davide
Спасибо, исправлена эта ссылка сейчас. –