2015-03-18 2 views
1

Я пытаюсь написать приложение 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 так же, как и редактор. Что я ошибаюсь?

+0

_Nick Cooper's_ ссылка не работает – davide

+0

Спасибо, исправлена ​​эта ссылка сейчас. –

ответ

1

Я нашел решение путем дальнейших проб и ошибок. Вместо расширения пути класса до "target/scala-2.11/classes_managed" он должен быть расширен до "target/scala-2.11/classes". Другими словами, линия в build.sbt должна быть

unmanagedJars in Compile += (baseDirectory.value/"target/scala-2.11/classes") 

Теперь из SBT я могу скомпилировать, проверить и запустить приложение, и успешно подключаться к локальной машине: 9000, и я также могу открыть файлы в Eclipse, не видя строк ошибок ,

Я до сих пор не знаю, почему NoClassDefFoundError действительно произошло в предыдущей настройке, но это проблема для другого дня.

0

Я использую активатор, но я думаю, это может быть то же самое.

Таким образом, Eclipse не очень нравится структурные изменения в проекте Play или добавление/удаление библиотек (через libraryDependencies и т. Д.), И везде отображаются красноватые вещи. Это, как я их решить:

activator clean compile 

Если я добавил/удаленные библиотеки, я бегу

activator eclipse 

так, что Eclipse, получает изменения.

Он работает каждый раз. Чистый, чистый, чистый.Я на самом деле нашел это решение где-то в Сети, но не могу вспомнить, где, извините.

EDIT

и обновить проект в Eclipse,!

+0

Странно, что не работает для меня. Я загрузил Activator и установил простое приложение Play из шаблона. Я запускал ваши команды, открывал Eclipse, а красные строки ошибок появлялись в Application.scala. (Приложение на localhost: 9000 работает нормально.) –

+0

Вы также обновили проект в Eclipse? Извините, я не упомянул об этом ... – Johnny

+0

Да, определенно обновил проект в Eclipse - набрав 'eclipse' в sbt. Много ли это! –

Смежные вопросы