如何在 Grails 中将真实路径作为字符串

How do I get real path as string in Grails

使用 grails-3.3.1 开发项目并生成一个 Runnable WAR 文件。当我 运行 使用命令时:

java -jar build/libs/myproject-0.1.war

它正在为以下行返回 null

serveltContext.getRealPath("/someSource");

但在 Tomcat 容器中部署时它工作正常。

然后尝试了以下方法:

servletContext.getResource("someSource").getPath();

它正在返回,但不是预期的那个,也不是 getRealPath() returns。 它像这样返回:

D:/myprojects/myproject/build/libs/myproject-01.war*/

这对我没用。找到建议使用 getResourceAsStream() 的答案,但我不想要资源,我只想要 String

我找不到既能在本地工作又能在容器中部署时工作的解决方案。我最终使用此解决方法来获取路径,具体取决于代码在哪个环境中 运行 in:

def path
if (Environment.current == Environment.DEVELOPMENT) {
    path = java.nio.file.FileSystems.default.getPath("someSource").toAbsolutePath().toString()
} else {
    path = ServletContextHolder.servletContext.getRealPath("/someSource")
}

我在使用 Grails 4.0.11 时遇到了同样的问题。似乎 serveltContext.getRealPath 已弃用并且 returns 为空。您的解决方案对我也不起作用,所以我决定采用以下方法: (发现于 https://howtodoinjava.com/spring-boot2/read-file-from-resources/

  import org.springframework.core.io.ClassPathResource
  import org.springframework.core.io.Resource

  Resource resource = new ClassPathResource("pdfResources/fonts/SFUIText-Medium.ttf") 
  String path = resource?.getPath()

鉴于我的应用名为“filetest”,该文件位于 filetest/src/main/resources/pdfResources/fonts/SFUIText-Medium.ttf

这适用于“grails run-app”和“grails war”作为嵌入式可运行war 文件。希望对你有帮助,因为我花了很长时间。