Добавление записей в classpath с помощью Gradle Плагин приложений
Я использую Gradle Плагин приложений для создания установки для автономного приложения Java. У меня есть файл конфигурации, который мне нужно наложить на путь к классам, но я не могу заставить его правильно генерировать путь к классам в файлах sh/bat. Этот файл конфигурации должен располагаться за пределами банки.
Файл conf находится в каталоге /src/dist/conf/
, поэтому, когда я запускаю installApp
, он устанавливает его в директорию conf, подобную этой $APP_HOME/conf
.
Я попытался добавить этот каталог в claspath следующим образом:
startScripts.classpath.add(files('$APP_HOME/conf'))
но когда я смотрю путь к классам в файлах sh/bat, он добавляет запись, которая выглядит так:
$APP_HOME/lib/conf
Как сообщить Gradle опустить раздел lib
для этой записи?
Ответы
Ответ 1
Мне кажется, что то, что я пытаюсь сделать, не должно быть настолько необычным, но в качестве обходного пути я могу иметь каталог dist
src/dist/lib/conf
, который позволяет директории conf
быть помещены в каталог lib
и путь к классам, который gradle генерирует для правильных файлов sh/bat.
Я приму другой ответ, если у кого-то есть лучший.
Ответ 2
Другим обходным решением для этой проблемы (GRADLE-2333) предложен Александр Фадеев здесь.
Здесь (немного изменено) решение Александра, которое решило проблему для меня на Gradle -1.6:
startScripts {
classpath += files('src/dist/XxxAPlaceHolderForAConfigxxX')
doLast {
def windowsScriptFile = file getWindowsScript()
def unixScriptFile = file getUnixScript()
windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\XxxAPlaceHolderForAConfigxxX', '%APP_HOME%\\config')
unixScriptFile.text = unixScriptFile.text.replace('$APP_HOME/lib/XxxAPlaceHolderForAConfigxxX', '$APP_HOME/config')
}
}
Это немного уродливее, чем решение Josh, но оно позволяет сохранить точный каталог (/src/dist/conf и $APP_HOME/conf), упомянутый в исходном вопросе.
Ответ 3
Самый простой способ получить файл на пути к классу - поместить его в src/main/resources
. src/dist
предназначен для добавления файлов в дистрибутив (т.е. zip файл), а не в путь Jar/class.
Ответ 4
Это не очень хороший ответ на ваш вопрос, но я нашел несколько примеров, когда задача startScripts еще не обладает необходимой гибкостью.
Я работал над несколькими этими экземплярами, напрямую редактируя содержимое файла... не совсем используя превосходную модель Gradle и не особо рекомендую, но, по крайней мере, демонстрирует, насколько гибким является Gradle!
Итак, вы могли бы что-то взломать в classpath следующим образом:
tasks.startScripts {
doLast {
def scriptFile = file "${outputDir}/${applicationName}"
scriptFile.text = scriptFile.text.replace('CLASSPATH=$APP_HOME/lib', 'CLASSPATH=$APP_HOME/conf/:$APP_HOME/lib')
}
}
Помните о нарушении начальной независимости платформы script при этом.
Ответ 5
Я сделал вариант рецепта Мартина Доу ниже:
Я заменю "APP_HOME =" на "export APP_HOME =" в начале script.
Тогда мой код может сделать System.env.get( "APP_HOME" ), а затем перейти к, например,. conf/folder.
Это мой Gradle хак:
tasks.startScripts {
doLast {
def scriptFile = file "${outputDir}/${applicationName}"
scriptFile.text = scriptFile.text.replaceAll('APP_HOME=', 'export APP_HOME=')
}
}
Пример кода Java в приложении:
String APP_HOME = System.env().get("APP_HOME");
Properties p = new Properties();
p.load(new FileInputStream(APP_HOME + "/conf/myapp.properties"))
Надеюсь, что это поможет.
ПРИМЕЧАНИЕ. "Экспорт" не работает в Windows!