1

在读取“user.dir”属性时,根据代码的启动方式,从我的代码中获得一致的结果有点噩梦。

我有一个 gradle 项目,在 src/main/groovy 中有一些代码和脚本,在 source/test/groovy 中有测试,从命令行或在 IDE 中运行代码(直接运行脚本)并运行一些测试

我为自己构建了一个新的 gradle 项目,并试图在 src/main/resources 中打开文件资源。

当我运行单元测试时, user.dir = 'project root' (这是我所期望的)。当我在 IDE 中构建脚本并右键单击时,user.dir 属性返回源主目录中的当前脚本目录路径!

所以在测试中的查找返回了不同的测试。

我也尝试在 build.gradle 中设置它

//setup proj.dir as project root
System.setProperty( "proj.dir", project.projectDir.toString() )

并构建一个 gradle 任务来打印这个 - 它显示项目目录作为结果。

在将属性“user.dir”读取为项目根目录时,intellij 中似乎没有全局“修复或配置”始终获得一致的返回。除非我错过了什么?

在 IDE 中,如果我查看运行/调试配置 - 在默认情况下,groovy 的条目表示工作目录是项目根目录(如 id 预期的那样)。但是,当我查看 groovy 节点和那里的脚本('testPCE')时,工作目录被设置为脚本的当前位置。

一旦我发现我可以编辑 IDE 运行/调试配置,我将工作目录重置为项目根目录,现在得到一致的结果。但如果我需要,似乎必须在每个脚本上检查这一点。

所以我的问题是我可以做什么/配置/设置,以便我获得一个始终返回项目根目录的环境变量,无论是从命令行启动,在gradle中,通过从IDE中右键单击脚本运行,还是从测试中运行IDE/ 或从命令行

必须有一种“健壮”的方法来确保对某个环境变量的所有查找都将返回相同的答案,而不管您的代码是如何执行的。

知道我知道发生了什么,我可以调整我的 ide 以设置我想要工作目录的位置 - 但必须继续检查。我想要一些可靠的东西,无论是它的 IDE、命令行、tomcat Web 容器内部等,以获取“项目根”并从这个稳定点可靠地构建路径,这将始终如一地工作

有谁知道如何做到这一点?

4

1 回答 1

0

也许不理想,但这是可行的。我正在尝试从类路径中的资源区域加载配置文件,但我的代码是类中的静态块。

在这种情况下,我必须获取 Class 对象的 classLoader 和 getResource (包括检查类路径(如果我可以避免的话,我不想要这个项目的 spring 依赖项)。

因此,似乎工作的代码 - 无需解析“user.dir”属性如下所示

//configure standard converters
static {
    // class class loader will include resources so file will be found
    def configFile =  "config/BinderConfig.groovy"
    def resource = new File (configFile).canonicalPath
    resource = Gbinder.getClassLoader().getResource(configFile)
    def binderConfig = new ConfigSlurper().parse (resource)

    binderConfig.global.converters.each {
    typeConverters << it
    }

    typeConverters
 }
于 2017-11-17T20:23:23.613 回答