Вопрос по gradle, java – Добавление записей classpath с помощью плагина Gradle's Application

20

Я использую плагин Gradle для приложения, чтобы сгенерировать установку для отдельного Java-приложения. У меня есть файл конфигурации, который мне нужно поместить в classpath, но я не могу заставить его правильно генерировать classpath в файлах sh / bat. Этот файл конфигурации должен находиться за пределами банки.

Файл conf находится в каталоге/src/dist/conf/ поэтому, когда я бегуinstallApp он устанавливает его в каталоге conf, как это$APP_HOME/conf.

Я попытался добавить этот каталог в claspath следующим образом:

<code>startScripts.classpath.add(files('$APP_HOME/conf'))
</code>

но когда я смотрю на путь к классам в файлах sh / bat, он добавляет запись, которая выглядит следующим образом:

<code>$APP_HOME/lib/conf
</code>

Как мне сказать Gradle, чтобы броситьlib раздел для этой записи?

Ваш Ответ

5   ответов
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')
  }
}

Имейте в виду, что при этом нарушается независимость платформы стартового скрипта.

3

Я заменяю «APP_HOME =» с & apos; export APP_HOME = & apos; в стартовом скрипте.

Затем мой код может выполнить System.env.get (& quot; APP_HOME & quot;) и затем перейти, например, к. конф / папка.

Это мой взлом 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"))

Надеюсь это поможет.

NOTE: "export" does not work in Windows!

3

что то, что я пытаюсь сделать, не должно быть настолько необычным, но в качестве обходного пути я могу получитьdist каталог будетsrc/dist/lib/conf что позволяетconf каталог для размещения вlib каталог и путь к классу, который генерирует gradle для правильности файлов sh / bat.

Я приму другой ответ, если у кого-то есть лучший.

Error: User Rate Limit Exceeded Josh
Error: User Rate Limit Exceededsrc/dist/lib/confError: User Rate Limit ExceededsourceSets.main.resourcesError: User Rate Limit Exceeded
4

вsrc/main/resources. src/dist предназначен для добавления файлов в дистрибутив (т.е. zip-файл), а не в путь Jar / class.

Error: User Rate Limit Exceeded Josh
14

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')
  }
}

Это немного страшнее, чем решение Джоша, но позволяет сохранить точную структуру каталогов (/ src / dist / conf и $ APP_HOME / conf), упомянутую в исходном вопросе.

Похожие вопросы