Java 带有conf文件夹的Gradle构建文件,其属性不在jar中,而是在类路径上

Java 带有conf文件夹的Gradle构建文件,其属性不在jar中,而是在类路径上,java,gradle,Java,Gradle,请将build.gradle脚本示例与配置的文件夹“conf”共享: 此文件夹包括所有包含文件,在“gradle distZip”期间打包成zip文件 此文件夹中的文件位于startscripts文件(在bin文件夹中)的类路径上(例如,类加载器可以访问) 当运行gradlerun、gradlebuild等时,这些文件也在类路径上 添加#1: 我已经完成了@wakjah在回答中提到的操作,文件被复制到zip文件中,并且在gradle distZip期间没有放入jar,这满足了我的要求#1。但此文

请将build.gradle脚本示例与配置的文件夹“conf”共享:

  • 此文件夹包括所有包含文件,在“gradle distZip”期间打包成zip文件
  • 此文件夹中的文件位于startscripts文件(在bin文件夹中)的类路径上(例如,类加载器可以访问)
  • 当运行gradlerun、gradlebuild等时,这些文件也在类路径上
  • 添加#1:

    我已经完成了@wakjah在回答中提到的操作,文件被复制到zip文件中,并且在
    gradle distZip
    期间没有放入jar,这满足了我的要求#1。但此文件夹不在
    bin
    文件夹的启动脚本中的类路径上(要求2是未涵盖)。运行
    gradle clean run
    时,文件不在类路径上(要求#3是未涵盖

    添加#2:

    我从无到有地开始了示例项目,在@wakjah的帮助下,现在我有了:

  • 请求#1:ok(目录
    config
    包含资源文件),但此资源也位于
    lib
    文件夹中
  • 请求2:ok(目录
    config
    位于启动脚本的类路径上),但类路径还包含无效文件夹
    %APP\u HOME%\lib\config
  • 要求#3:可以
  • 此外,我测试了3种加载文件内容的方法(如前所述),方法
    Thread.currentThread().getContextClassLoader().getResource(name)
    成功

    在此处添加了我的示例项目zip文件:

    添加#3

    当我在gradle脚本中注释/删除时:

    依赖项{
    运行时文件('src/dist/config')
    }

    lib/config
    文件夹不在类路径上(正常),并且资源文件未复制到
    lib
    文件夹(正常)。但资源文件无法从Idea加载起始类main()方法,也无法从命令提示符下运行
    gradle clean run
    。在
    gradle clean distZip
    和部署(解包)应用程序之后,将加载资源

    添加#4

    更换后

    依赖项{
    运行时文件('src/dist/config')
    }

    tasks.withType(JavaExec){
    classpath+=文件('src/dist/config')
    }
    一切都很好,谢谢,@wakjah! 还有一个问题,在初始需求中没有提到:当我在Idea内部启动这个项目时(不是执行gradle run,而是直接从Idea在类中启动main()),无法使用前面提到的任何方法加载
    config
    目录中的文件

    如本文所述,您只需将文件夹
    dist/config
    添加到
    src
    文件夹中,它将自动包含在
    distZip
    任务中

    至于将其添加到运行时类路径,只需将文件夹作为依赖项添加即可(见下文)

    由于
    startScripts
    的限制,需求#2有点难。然而,这个问题的答案提出了一个解决办法:

    以下代码收集上述所有内容:

    // 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')
      }
    }
    
    我已经测试过了,它似乎是有效的。正确的类路径条目出现在运行脚本和gradle在运行任务期间使用的命令行中

    编辑:在您的注释中,您暗示您也希望在构建脚本的类路径中可以使用此选项。如果是这种情况,则需要添加如下buildscript依赖项:

    buildscript {
      dependencies {
        classpath files('src/dist/config')
      }
    }
    
    编辑#2:在另一条评论中,您提到添加运行时依赖项会产生意外的结果,即在开始脚本类路径中生成一个额外的无效条目。您可以通过添加到任何
    JavaExec
    任务的类路径,而不是使用依赖项来解决这个问题。因此,将
    依赖项{runtime{…}}
    块替换为

    tasks.withType(JavaExec) {
      classpath += files('src/dist/config')
    }
    

    可能重复@wakjah我在创建我的问题之前没有找到您提到的问题/答案,谢谢您的指点。我会检查一下。最可靠的方法可能是:在执行distZip任务(或相关任务,例如distTar等)时,执行以下操作:1)通过掩码(或全部)将文件复制到zip(tar.gz)文件中的指定文件夹;2). 用于将此文件夹添加到类路径的修补程序启动脚本。但是我不知道怎么做,所以非常感谢gradle大师的帮助。@lospejos:你找到了另外提到的问题的解决方案吗?因此,您可以在
    src/dist/config
    中找到IntelliJ类路径上的资源,但不在最终jar文件中吗?我有一个错误:
    “在评估根项目“report rest server sparkjava”时出现问题。>找不到参数[文件集合]的方法runtime()在类型为org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler的对象上。我将您提到的
    dependencies
    block放入gradle脚本的根目录以及gradle脚本中的
    buildscript
    block中,但运气不好。Gradle 2.14.1-rc-2正如我之前所说,我不是一个高级Gradle用户(这很遗憾),所以请你具体说明我应该把你的台词放在哪里?将
    startScripts
    块放入脚本“根”链(不在某些闭包下)会导致:
    找不到参数的方法startScripts()[build_6f9g84j5bx1rq0giscgo9symy$\u run_closure2@3419e23b]在org.gradle.api.project类型的根项目“”上
    @lospejos,您需要应用
    应用程序
    插件才能使用
    startScripts
    ——请参阅我的添加#2在问题中,我们几乎完成了(注意开始脚本类路径中的额外文件夹)。请参阅添加#2和#3