Указание «предоставленных» зависимостей с помощью grails в maven
-
28-10-2019 - |
Вопрос
У меня есть приложение Grails 1.3.7. Я использую классы Spring JMS, чтобы настроить одну из моих служб grails в качестве слушателя сообщений, настраивая эти классы в grails-app / conf / resources.groovy. Я использую maven 2.0.9 для сборок, используя grails-maven-plugin 1.3.7 и цель «maven-war» для создания файла war.
У меня есть два сценария:
- Я хочу иметь возможность запускать мое приложение grails локально из командной строки, используя «mvn grails: run-app». Я использую это во время разработки.
- Я хочу иметь возможность запускать приложение в JBoss 5.1.0 GA, развернув военный файл, созданный maven. Это то, что мы делаем в нашей среде интеграции, тестирования и производства.
При работе внутри JBoss все зависимости, связанные с JMS-провайдером, доступны и предоставляются сервером приложений. Обычный способ справиться с этим с помощью maven - объявить эти зависимости в файле pom с областью действия "provided". Это сделает эти зависимости доступными для компиляции и модульных тестов, но исключит их из файла war.
Однако, когда я запускаю локально из командной строки с помощью «mvn grails: run-app», оказывается, что эти зависимости недоступны для grails во время выполнения, о чем свидетельствуют многие исключения ClassNotFound и т. д. Изменение области видимости на "компилировать" позволяет мне работать локально. Однако теперь эти зависимости упаковываются в мой военный файл, который мне не нужен и который имеет тенденцию ломать работу при запуске внутри JBoss.
Решение (или обходной путь), который я нашел на данный момент, состоит в том, чтобы включить эти зависимости JMS в область действия по умолчанию (компиляцию) в мой pom и удалить эти банки (и все их транзитивные зависимости) из файла войны с помощью некоторого кода в BuildConfig .groovy (см. ниже). Это работает, но это беспорядочно и подвержено ошибкам, потому что мне нужно перечислить каждую транзитивную зависимость (а их много!).
Еще кое-что, что я пробовал:
Сначала я подумал, что, возможно, смогу добавить необходимые зависимости JMS в BuildConfig.groovy в разделе «grails.project.dependency.resolution / dependencies» и полностью исключить их из pom. Однако это не сработало, потому что, согласно эта ссылка , раздел зависимостей BuildConfig игнорируется при запуске grails под maven.
Я также заметил параметр "pom true" (упомянутый в приведенной выше ссылке) и попытался использовать его. Однако при попытке запустить grails: run-app grails выдает предупреждения о неразрешенных зависимостях и выдает ошибку tomcat:
родовое словоМой вопрос: Есть ли лучший способ - с помощью параметров конфигурации grails и / или maven - выполнить то, что я хочу, то есть иметь возможность успешно запускать grails локально и в JBoss, без необходимости вручную исключать все транзитивные зависимости из файла war?
Примечание. Я не могу изменить используемую мной версию grails, JBoss или maven.
Некоторые выдержки из соответствующих файлов:
BuildConfig.groovy:
родовое словоpom.xml:
родовое словоresources.groovy:
родовое словоРешение
Решением для этого является создание динамической области для вашей зависимости через профиль.
Пример:
родовое словоЗатем, когда в вашей командной строке будет указан профиль:
родовое словоНадеюсь, это поможет.
Другие советы
Это было «исправлено» в Grails 2.0.Плагин maven для grails был обновлен, так что «предоставленная» область видимости означает, что зависимость доступна при локальном запуске, но не включена в файл war package.