请与分享的文件夹共享build.gradle脚本示例" conf":
加法#1:
我已经完成了@wakjah指出的回复中提到的操作,文件被复制到一个zip文件中,并且在gradle distZip
期间没有被放入jar中,这个涵盖了我的要求#1 。但是此文件夹不在bin
文件夹的启动脚本的类路径中(要求#2 未涵盖)。运行gradle clean run
时,文件不在类路径中(要求#3 未涵盖)。
加法#2:
我从零开始,在 @wakjah 的帮助下开始了示例项目,现在我有:
config
包含资源文件),但此资源也位于lib
文件夹中。config
在启动脚本的类路径中),但classpath另外包含无效的文件夹%APP_HOME%\lib\config
此外,我测试了3种加载文件内容的方法(如上所述here),方法Thread.currentThread().getContextClassLoader().getResource(name)
成功。
在此处添加了我的示例项目zip文件:http://rgho.st/8r2dJjSz7
添加#3 :
当我在gradle脚本中评论/删除时:
dependencies {
runtime files('src/dist/config')
}
lib/config
文件夹不在CLASSPATH上(没关系),资源文件也没有复制到lib
文件夹(没关系)。但是资源文件无法加载Idea的起始类main()方法和从命令提示符运行gradle clean run
。在gradle clean distZip
和部署(解包)应用程序之后,资源被加载。
添加#4 :
更换后
dependencies {
runtime files('src/dist/config')
}
要
tasks.withType(JavaExec) {
classpath += files('src/dist/config')
}
一切都很顺利,谢谢, @wakjah !
还有一个问题,在初始要求中没有提到:当我在Idea中启动这个项目时(不执行gradle run,但直接从Idea中启动main()),无法使用config
目录中的文件加载前面提到的任何方法。
答案 0 :(得分:2)
如此处Gradle distZip config files所述,您只需将文件夹dist/config
添加到src
文件夹即可自动包含在distZip
任务中。
至于将其添加到运行时类路径中,只需将该文件夹添加为依赖项(参见下文)。
由于startScripts
的限制,要求#2稍微困难一些。但是,这个问题的答案提出了一种解决方法:Adding classpath entries using Gradle's Application plugin
以下代码收集了以上所有内容:
// put config files in src/dist/config
dependencies {
runtime files('src/dist/config')
}
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')
}
}
我已对此进行了测试,似乎可行。在run
任务期间,gradle使用的运行脚本和命令行中都会显示正确的类路径条目。
编辑:在您的评论中,您暗示您还希望在构建脚本的类路径中提供此选项。如果是这种情况,则需要添加如下的buildscript依赖项:
buildscript {
dependencies {
classpath files('src/dist/config')
}
}
编辑#2:在另一条评论中,您提到添加运行时依赖项会导致在启动脚本类路径中生成额外的无效条目。您可以通过添加任何JavaExec
任务的类路径来解决此问题,而不是使用依赖项。所以用
dependencies { runtime { ... } }
块
tasks.withType(JavaExec) {
classpath += files('src/dist/config')
}