使用Gradle的Application插件添加类路径条目

时间:2012-05-09 14:53:10

标签: java build gradle

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

conf文件位于/src/dist/conf/目录中,因此当我运行installApp时,它会将其安装在像$APP_HOME/conf这样的conf目录下。

我尝试将此目录添加到claspath中,如下所示:

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

但是当我查看sh / bat文件中的类路径时,它会添加一个如下所示的条目:

$APP_HOME/lib/conf

如何告诉gradle删除此条目的lib部分?

5 个答案:

答案 0 :(得分:14)

此问题的另一个解决方法(GRADLE-2333)由Alexandr Fadeev here提出。

这是(有点修改)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)。

答案 1 :(得分:4)

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

答案 2 :(得分: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')
  }
}

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

答案 3 :(得分:3)

在我看来,我尝试做的事情不应该与众不同,但作为一种解决方法,我可以将dist目录设为src/dist/lib/conf,允许{ {1}}目录放在conf目录中,gradle生成的类路径使sh / bat文件正确。

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

答案 4 :(得分: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中不起作用!