Интеграция Groovy с Java - PullRequest
       4

Интеграция Groovy с Java

8 голосов
/ 26 февраля 2011

В настоящее время я работаю над интеграцией Groovy с существующим Java-проектом. Скрипт Groovy в основном анализирует XML на объекты и затем использует существующие DAO для сохранения, обновления и т. Д. У меня есть 2 проекта. Один заводной. Одна ява Используя Maven (я использовал плагин gmaven), я собираю Java, а затем создаю проект Groovy.

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

Например, мои классы Java

State(1 Field)
StateDAO

Сценарий Groovy, который нужно вызвать, в основном анализирует документ XML, а затем заполняет таблицу, используя DAO, значением s, и на данный момент все, что я хотел бы сделать, это опубликовать его в базе данных.

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения. Спасибо!

Ответы [ 2 ]

24 голосов
/ 26 февраля 2011

Вообще говоря, существует два подхода для интеграции Groovy с Java:

  1. Заставить Java-код скомпилироваться и выполнить Groovy-код во время выполнения
  2. Скомпилируйте и упакуйте код Groovy как часть вашей сборки, так же, как вы делаете для кода Java

Используйте 1., если вам нужно решение для "сценариев", а код Groovy, который нужно выполнить, известен только во время выполнения. Например, код можно загрузить из базы данных или ввести на экране графического интерфейса. Если вы просто хотите упростить свою жизнь, написав некоторые части своего приложения на Groovy, перейдите к 2. Два типичных примера, которые могут быстро окупиться, - это анализ XML и тестирование (конечно, их гораздо больше).

Если вы более заинтересованы в 2., вы можете скомпилировать Groovy и Java отдельно или вместе. Если вы компилируете их отдельно, статические ссылки могут идти только в одном направлении, как если бы у вас было два Java-модуля. Если вы скомпилируете их вместе, вы можете произвольно смешивать код Groovy и Java, как если бы это был весь код Java в одном модуле.

Компиляция кода Java и Groovy возможна благодаря функции компилятора Groovy, называемой Совместная компиляция . К сожалению, у GMaven есть серьезные проблемы с совместной компиляцией, и нет никаких признаков того, что это изменится в ближайшее время. Для небольших проектов это может сойти с рук, но для более крупных проектов это укусит вас (я был там). Есть решения, но они не приходят бесплатно. Если вы открыты для (G) альтернатив Maven, рассмотрите возможность перехода на Gradle , который имеет гораздо лучшую поддержку Groovy. (Отказ от ответственности: я один из разработчиков Gradle.)

Если вы решили придерживаться GMaven, убедитесь, что вы правильно настроили его конфигурацию. Почти каждый проект, который я вижу, терпит неудачу на этом этапе, часто даже не осознавая этого. Документация GMaven устарела, но список рассылки Groovy содержит несколько сообщений на эту тему. Вы также можете скопировать конфигурацию из Spock (один из моих собственных проектов).

Чтобы включить совместную компиляцию GMaven, добавьте цель generateStubs. Пока ваш проект компилируется без этой цели, оставьте его. Также есть цель generateTestStubs, но она редко нужна.

Это рассказ. Для долгой истории, посмотрите будущую книгу Мэннинга Создание Java Groovy . (Я не связан с автором.)

5 голосов
/ 26 февраля 2011

Для предложения Питера № 1, приведенного выше, я собрал набор примеров использования Java для запуска скриптов Groovy в посте блога некоторое время назад , который поставляется вместе с примерами кода на github . Я также могу поддержать его в комментариях относительно GMaven и совместной компиляции - это работает, но может в конечном итоге вызвать больше проблем, чем оно того стоит. +1 к рассмотрению Gradle, а также. Хотя большая часть моего опыта его использования для производства связана с исходным кодом Java и тестовым кодом Groovy, до сих пор он работал без нареканий. Желаем удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...