Grails 如何在Config.groovy中导出相对目录的物理路径?

Grails 如何在Config.groovy中导出相对目录的物理路径?,grails,groovy,Grails,Groovy,我正在尝试使用GitHub的源代码设置Weceem。它需要上传目录的物理路径定义,以及用于写入可搜索索引的目录的物理路径定义。上载的默认设置为: weceem.upload.dir = 'file:/var/www/weceem.org/uploads/' 我想使用相对路径(如WEB-INF/resources/uploads)来定义它们。我尝试了一种我以前使用过的方法来访问相对路径如下的目录: File uploadDirectory = ApplicationHolder.applic

我正在尝试使用GitHub的源代码设置Weceem。它需要上传目录的物理路径定义,以及用于写入可搜索索引的目录的物理路径定义。上载的默认设置为:

weceem.upload.dir = 'file:/var/www/weceem.org/uploads/'
我想使用相对路径(如WEB-INF/resources/uploads)来定义它们。我尝试了一种我以前使用过的方法来访问相对路径如下的目录:

  File uploadDirectory = ApplicationHolder.application.parentContext.getResource("WEB-INF/resources/uploads").file
  def absoluteUploadDirectory = uploadDirectory.absolutePath
  weceem.upload.dir = 'file:'+absoluteUploadDirectory

但是,ApplicationHolder.application下的“parentContext”为空。有谁能提供一个解决方案,让我可以使用相对路径吗?

看看你应该有的Config.groovy(可能有注释)

在部署服务器中创建Conig文件

"${userHome}/.grails/${appName}-config.properties"

并在该配置文件中定义您的道具(甚至不是相对路径)

看看你应该拥有的Config.groovy(可能有注释)

在部署服务器中创建Conig文件

"${userHome}/.grails/${appName}-config.properties"

并在该配置文件中定义您的道具(甚至不是相对路径)

补充Aram Arabyan的回答,这是正确的,但缺乏解释:

Grails应用程序不像PHP应用程序那样具有“本地”目录。它们应该(用于生产)部署在servlet容器中。该内容的位置不应被视为可写,因为它可能在下一次部署时被删除

简言之:将部署的应用程序视为已编译的二进制文件

取而代之的是,在服务器上的某个地方选择一个特定的位置,以便上传活动,最好是在web服务器路径之外,这样就不能直接访问它们。这就是为什么Weceem默认为
/var/www/Weceem.org/
下的自定义文件夹

如果使用该技术配置路径,则可以拥有特定于服务器的路径,并在开发计算机上包含不同的路径


但是,在这两种情况下,您都应该使用绝对路径,或者至少使用相对于已知目录的路径。

添加到Aram Arabyan的响应中,这是正确的,但缺少解释:

Grails应用程序不像PHP应用程序那样具有“本地”目录。它们应该(用于生产)部署在servlet容器中。该内容的位置不应被视为可写,因为它可能在下一次部署时被删除

简言之:将部署的应用程序视为已编译的二进制文件

取而代之的是,在服务器上的某个地方选择一个特定的位置,以便上传活动,最好是在web服务器路径之外,这样就不能直接访问它们。这就是为什么Weceem默认为
/var/www/Weceem.org/
下的自定义文件夹

如果使用该技术配置路径,则可以拥有特定于服务器的路径,并在开发计算机上包含不同的路径

但是,在这两种情况下,您都应该使用绝对路径,或者至少使用相对于已知目录的路径

            String base = System.properties['base.dir']     
            println "config: ${base}/web-app/config/HookConfig.grooy"
            String str = new File("${base}/web-app/config/HookConfig.groovy").text
            return new ConfigSlurper().parse(str)

i、 e


对于它的价值,我也尝试过这样做:
File uploadDirectory=ApplicationHolder.getApplication().getParentContext().getResource(“resources/uploads”).getFile()
,我也尝试过这样做:
File uploadDirectory=ApplicationHolder.getApplication().getParentContext().getResource(“resources/uploads”).getFile()
,但同样,“不能在null对象上调用方法getParentContext()”这很有意义,但我正试图确定,当您不知道物理目录结构是什么,甚至更肯定的是,您没有写入大部分内容的权限时,我将如何将此应用于部署到像CloudBees这样的SaaS的应用程序。你有没有想过像Weceem这样的东西如何与这样的服务结合使用?老实说,我没有任何允许上传的意图,所以用/foo/bar填充它可能就足够满足我的需要了,但假设我真的想使用该功能,你对此有什么想法吗?如果你要退出到云服务(你真的应该提到这一点!),您通常只能访问临时存储。正确的解决方案是使用专用服务(如AmazonS3)来存储文件。我不知道Weceem,所以我不知道这是否可能。此外,可搜索索引问题是一个已知的问题,在那种环境中可能很难解决。这是有道理的,但我正在尝试确定如何将其应用于部署到SaaS(如CloudBees)的应用程序,而您不知道物理目录结构是什么,而且更明显的是,我们没有权限写入其中的大部分内容。你有没有想过像Weceem这样的东西如何与这样的服务结合使用?老实说,我没有任何允许上传的意图,所以用/foo/bar填充它可能就足够满足我的需要了,但假设我真的想使用该功能,你对此有什么想法吗?如果你要退出到云服务(你真的应该提到这一点!),您通常只能访问临时存储。正确的解决方案是使用专用服务(如AmazonS3)来存储文件。我不知道Weceem,所以我不知道这是否可能。此外,可搜索索引问题是一个已知的问题,在这种环境下很难解决。
def grailsApplication    
private getConfig() {
            String str = grailsApplication.parentContext.getResource("config/HookConfig.groovy").file.text
            return new ConfigSlurper().parse(str)
}