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

我正在使用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部分?

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

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

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

这对你的问题不是一个特别好的答案,但是我发现了一些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') } } 

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

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

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

我在下面做了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中不起作用!