我正在使用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
部分?
答案 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/resources
。 src/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中不起作用!