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

Добавление записей в 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 для этой записи?

4b9b3361

Ответ 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!