如何在gradle的应用程序插件“运行”任务的类路径上指定一个额外的文件夹?

2022-09-04 08:26:58

我已经成功地配置了我的gradle构建脚本,以创建应用程序的zip分布,并在根目录下使用额外的“config”文件夹。此文件夹(至少现在)仅包含一个应用程序正在使用的属性文件,并且位于应用程序的类路径上。

但是,我现在正在寻找的是一种对应用程序插件中的“run”任务执行相同操作的方法。当我尝试以这种方式运行应用程序(用于测试)时,我的程序无法运行,因为类尝试访问类路径根目录上的此属性文件。

一个好处是,如果我可以让IntelliJ或Eclipse也像其他文件夹(src/main/java,src/main/resources,...)一样将此文件夹添加到其类路径中,这样我就可以在IDE中运行和调试我的代码,而无需调用gradle任务。我想尽量避免将此代码绑定到任何一个IDE,以便当任何人需要处理该项目时,他们只需要导入build.gradle文件并让IDE制作所需的适当配置文件。

这是我的build.gradle文件:

apply plugin: 'application'

mainClassName = "MainClass"

startScripts {
    // Add config folder to classpath. Using workaround at
    // https://discuss.gradle.org/t/classpath-in-application-plugin-is-building-always-relative-to-app-home-lib-directory/2012
    classpath += files('src/dist/config')
    doLast {
        def windowsScriptFile = file getWindowsScript()
        def unixScriptFile = file getUnixScript()
        windowsScriptFile.text = windowsScriptFile.text.replace('%APP_HOME%\\lib\\config', '%APP_HOME%\\config')
        unixScriptFile.text = unixScriptFile.text.replace('$APP_HOME/lib/config', '$APP_HOME/config')
    }
}

repositories {
    ...
}

dependencies {
    ...
}

可能需要做的是,我需要将 /src/dist/config 文件夹复制到生成目录并添加到类路径中,或者将其内容复制到类路径上已有的文件夹中。


答案 1

我最终接受了Opal的建议作为提示,并提出了以下解决方案。我将以下内容添加到我的build.gradle文件中:

task processConfig(type: Copy) {
    from('src/main/config') {
        include '**/*'
    }

    into 'build/config/main'
}

classes {
    classes.dependsOn processConfig
}

run {
    classpath += files('build/config/main')
}

或者,更简单的方法是向我的项目添加运行时依赖项,如下所示:

dependencies {
    ...
    runtime files('src/main/config')
}

但是,我最终没有这样做,因为我的分发包最终在lib文件夹中具有.properties文件...我只是挑剔。


答案 2

正如您在文档中看到的那样,这是一项类型为的任务。因此,可以修改它的类路径。尝试将配置文件夹添加到类路径。请参阅此处runJavaExec


推荐