Почему IntelliJ IDEA может разрешать классы, а Groovy/Griffon не может?

Я работаю над приложением Griffon, используя IntelliJ, и пытаюсь использовать библиотеки проекта dcm4che. Мне удалось заставить редактор кода IntelliJ перестать жаловаться на отсутствующие классы, но когда я запускаю приложение Griffon, компилятор сгорает, жалуясь, что это unable to resolve class DicomInputStream и т. д.

Я не делаю ничего необычного. Все, что я делаю, это пытаюсь включить несколько простых файлов jar, но по какой-то причине все работает неправильно.

Признаюсь, я не особенно хорошо разбираюсь в решении проблем с classpath, и я использую IntelliJ совсем недавно, а Griffon/Groovy еще меньше, но я совершенно запутался.

Вот набор неудачных операторов импорта:

import org.dcm4che2.io.DicomInputStream
import org.dcm4che2.data.DicomObject
import org.dcm4che2.data.DicomElement

И это набор сообщений об ошибках, которые я получаю в консоли IntelliJ, когда пытаюсь запустить или отладить приложение:

Base Directory: C:\Users\[REDACTED]\MyApp\MyAppClient
Resolving dependencies...
Dependencies resolved in 698ms.
Running script C:\Program Files (x86)\Griffon\Griffon-0.9.4\scripts\RunApp.groovy
Environment set to development
 [griffonc] Compiling 32 source files to C:\Users\[REDACTED]\.griffon\0.9.4\projects\MyApp\classes
 [griffonc] org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
 [griffonc] C:\Users\[REDACTED]\MyApp\MyAppClient\griffon-app\controllers\myappclient\SelectRootController.groovy: 9: unable to resolve class org.dcm4che2.data.DicomElement
 [griffonc]  @ line 9, column 1.
 [griffonc]    import org.dcm4che2.data.DicomElement
 [griffonc]    ^
 [griffonc] 
 [griffonc] C:\Users\[REDACTED]\MyApp\MyAppClient\griffon-app\controllers\myappclient\SelectRootController.groovy: 7: unable to resolve class org.dcm4che2.io.DicomInputStream
 [griffonc]  @ line 7, column 1.
 [griffonc]    import org.dcm4che2.io.DicomInputStream
 [griffonc]    ^
 [griffonc] 
 [griffonc] C:\Users\[REDACTED]\MyApp\MyAppClient\griffon-app\controllers\myappclient\SelectRootController.groovy: 8: unable to resolve class org.dcm4che2.data.DicomObject
 [griffonc]  @ line 8, column 1.
 [griffonc]    import org.dcm4che2.data.DicomObject
 [griffonc]    ^
 [griffonc] 
 [griffonc] 3 errors
Compilation error: Compilation Failed

Чтобы установить библиотеки dcm4che, я сделал следующее:

  1. Загрузите бинарные файлы библиотеки (-bin zip) и распакуйте zip до MyApp\MyAppClient\lib\dcm4che-2.0.25-bin
  2. В диалоговом окне «Структура проекта» в разделе «Модули» -> «MyAppClient» на вкладке «Зависимости» я нажимаю «Добавить» и выбираю папку: MyAppClient\lib\dcm4che-2.0.25-bin\dcm4che-2.0.25\lib

На этом этапе редактор кода перестает жаловаться на то, что не может найти и разрешить классы, но когда я запускаю или отлаживаю приложение, я получаю ошибки компиляции. Все работает прекрасно без импорта этих классов (и кода, который их использует).

Что я могу сделать, чтобы решить эту проблему? Какая еще информация была бы полезна, чтобы понять, что происходит?


person cdeszaq    schedule 07.12.2011    source источник
comment
Как именно вы сообщили IDEA, где находятся ваши зависимости? AFAIK ортодоксальный способ - либо поместить их в каталог lib, либо использовать специальный DSL, чтобы указать на них через идентификаторы Maven.   -  person Peter Gromov    schedule 07.12.2011
comment
@PeterGromov, я добавил описание того, как я добавлял библиотеки. Основываясь на выводе консоли с этим импортом и без него, вызов Java вообще не меняется (например, для добавления каталога в путь к классам)   -  person cdeszaq    schedule 07.12.2011
comment
Пожалуйста, попробуйте поместить банку прямо под MyAppClient\lib.   -  person Peter Gromov    schedule 08.12.2011
comment
@PeterGromov, размещение всех jar-файлов в каталоге lib работает, но если я помещу их в какой-либо там каталог, например lib/dcm4che/, IDE сможет их найти, без проблем, но Griffon не сможет. Можно ли что-то сделать, чтобы это исправить? Мне бы очень не хотелось иметь все мои jar-файлы в одном массивном каталоге без какой-либо организации, особенно когда несколько проектов нуждаются в одних и тех же вещах.   -  person cdeszaq    schedule 08.12.2011
comment
Так работает Гриффон, извините. Вы можете попробовать управлять зависимостями через DSL (griffon.codehaus.org/guide/0.9.4/guide/), но имейте в виду, что IDEA в настоящее время не поддерживает это (youtrack.jetbrains.net/issue/IDEABKL-6134), и вам придется управлять зависимостями модуля вручную.   -  person Peter Gromov    schedule 08.12.2011


Ответы (1)


Как предлагает Питер, либо вы настраиваете библиотеку как зависимость, используя DSL зависимостей (если она доступна в репозитории maven или ivy), либо размещаете ее внутри MyApp/lib (без дополнительных подкаталогов). Таковы условности, установленные Грифоном.

person Andres Almiray    schedule 08.12.2011
comment
Было бы замечательно, если бы Грифону было проще справляться с большей организованностью каталога MyApp/lib. - person cdeszaq; 20.12.2011
comment
Вот почему у нас есть зависимость DSL в первую очередь. Однако мы можем поддерживать вложенные зависимости внутри $app/lib после того, как Griffon перейдет на версию 1.0. - person Andres Almiray; 20.12.2011