Как расширить путь к классам, используемый для '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 для моего контейнера сервлетов развертывания, так что это не проблема.
Ответы
Ответ 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