Подтвердить что ты не робот

Как расширить путь к классам, используемый для 'grails run-app'

У меня в файле Config.groovy есть следующее:

grails.config.locations = [ "classpath:env.groovy" ]

Теперь, где именно я должен разместить "env.groovy" таким образом, что он доступен на CLASSPATH во время выполнения grails run-app? Документации здесь очень не хватает.

Я могу заставить его работать над чистой командной строкой, разместив "env.groovy" в $APP_HOME/etc и затем выполнив:

$ grails -classpath ./etc run-app

Это кажется немного взломанным, но я могу жить с ним... Однако я не могу получить такую ​​конфигурацию, когда я запускаю run-app с помощью плагина Grails eclipse (STS):

Unable to load specified config location classpath:env.groovy : class path resource [env.groovy] cannot be opened because it does not exist

Я видел связанные сообщения здесь, здесь, здесь, и здесь, но ответы были неудовлетворительными.

Я ищу решение на основе CLASSPATH, которое будет работать с "run-app" в режиме разработки (как в командной строке, так и в eclipse). Я знаю, как настроить CLASSPATH для моего контейнера сервлетов развертывания, так что это не проблема.

4b9b3361

Ответ 1

Eric, так мы сделали это, указав свойство Java-системы с расположением файла конфигурации, а затем возьмем его на Config.groovy, примерно так:

if (System.properties["application.config.location"]) {
  grails.config.locations = [
          "file:" + System.properties["application.config.location"] + "${appName}-config.groovy"
  ]
}

Как вы можете видеть, мы устанавливаем только папку, в которой файл находится внутри системного свойства Java, и по соглашению мы говорим, что имя файла должно быть именем приложения + "-config.groovy", но если вам нужно вы можете указать весь путь, включая имя файла внутри свойства системы.

Затем при запуске приложения вы просто устанавливаете переменную следующим образом:

grails -Dapplication.config.location=/Users/eric/ run-app

Как вы можете видеть в коде, есть оператор if, который мешает вам искать файл конфигурации, если переменная системного свойства Java не определена, таким образом вы можете запускать приложение без использования внешнего файла конфигурации и просто используя настройки конфигурации, определенные в Config.groovy.

Если вы используете приложение в Eclipse или IntelliJ, вы передаете эту переменную как переменную JVM.

Это другой вариант - изменить путь к классам или включить файл конфигурации в путь к классам, чтобы приложение его подбирало.

Ответ 2

Мы можем добавить событие post compilation в _Events.groovy, чтобы скопировать наш внешний файл конфигурации в путь к классам следующим образом:

eventCompileEnd = {
ant.copy(todir:classesDirPath) {
  fileset(file:"${basedir}/grails-app/conf/override.properties")
}}

Вы можете найти более подробную информацию здесь

Ответ 3

В проекте должен находиться файл с именем .classpath.
Я не уверен, но посмотрите на этот файл.

Ответ 4

папки в пути к классам перечислены в файле .classpath по умолчанию в grails 2.5.0:

<classpathentry kind="src" path="src/java"/>
<classpathentry kind="src" path="src/groovy"/>
<classpathentry excluding="spring/" kind="src" path="grails-app/conf"/>
<classpathentry kind="src" path="grails-app/conf/spring"/>
<classpathentry kind="src" path="grails-app/controllers"/>
<classpathentry kind="src" path="grails-app/domain"/>
<classpathentry kind="src" path="grails-app/i18n"/>
<classpathentry kind="src" path="grails-app/services"/>
<classpathentry kind="src" path="grails-app/taglib"/>
<classpathentry kind="src" path="grails-app/utils"/>
<classpathentry kind="src" path="grails-app/views"/>
<classpathentry kind="src" path="test/integration"/>
<classpathentry kind="src" path="test/unit"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.grails.ide.eclipse.core.CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/eclipseclasses"/>

файлы в grails-app conf будут скопированы в WEB-INF/classes и будут частью класса class