21

我正在使用 Gradle 的应用程序插件为独立的 java 应用程序生成安装。我有一个需要放在类路径中的配置文件,但我似乎无法让它在 sh/bat 文件中正确生成类路径。此配置文件需要位于 jar 之外。

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此条目的部分?

4

5 回答 5

16

Alexandr Fadeev在这里提出了另一个解决此问题 ( GRADLE-2333 ) 的方法。

这是(稍加修改)Alexandr 在 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)。

于 2013-09-10T07:05:07.977 回答
4

将文件放入类路径的最简单方法是将其放入src/main/resources. src/dist用于将文件添加到发行版(即 zip 文件),而不是 Jar/类路径。

于 2012-05-09T15:26:39.663 回答
4

对于您的问题,这不是一个特别好的答案,但是我发现了一些 startScripts 任务还没有我们需要的灵活性的例子。

我已经通过直接编辑文件内容解决了其中的几个实例……没有完全利用 Gradle 的出色模型,也没有特别推荐,但至少展示了 Gradle 的灵活性!

所以你可以像这样在类路径中破解一些东西:

tasks.startScripts {
  doLast {
    def scriptFile = file "${outputDir}/${applicationName}"
    scriptFile.text = scriptFile.text.replace('CLASSPATH=$APP_HOME/lib', 'CLASSPATH=$APP_HOME/conf/:$APP_HOME/lib')
  }
}

执行此操作时请注意破坏启动脚本的平台独立性。

于 2012-05-31T06:12:22.990 回答
3

在我看来,我正在尝试做的事情不应该是那么与众不同,但作为一种解决方法,我可以拥有允许将dist目录放置在目录中的目录和 gradle 生成的类路径sh/bat 文件是正确的。src/dist/lib/confconflib

如果有人有更好的答案,我会接受另一个答案。

于 2012-05-09T20:02:34.950 回答
3

我在下面做了 Martin Dow 食谱的变体:

我在启动脚本中将 'APP_HOME=' 替换为 'export APP_HOME='。

然后我的代码可以执行 System.env.get("APP_HOME") 然后导航到例如 conf/ 文件夹。

这是我的 Gradle hack:

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 中不起作用!

于 2012-11-20T13:09:59.227 回答