我的播放应用程序是2.4.2。 在开发人员模式中,我曾经使用Source.fromFile(“./ public / files / abc.json”)从后端控制器的公共文件夹中读取文件
当我将应用程序转换为生产模式时,我收到了File Not Found Exceptions。我发现公用文件夹在生产模式下打包在资产jar中。我能做什么才能在开发和生产模式下工作?
答案 0 :(得分:4)
您是否试过这个Play文档https://www.playframework.com/documentation/2.5.x/AssetsOverview?这对Play 2.4来说很好,即使是2.3,我也试过了。
在那里你可以找到这个,你可以在conf / routes文件中执行此操作。
GET /assets/*file controllers.Assets.at(path="/public", file)
file - >是指文件名。 例如:myFile.json
要使其在生产模式下工作,您必须做更多的工作。如this回答中所述,将这些行添加到/build.sbt文件中。
import com.typesafe.sbt.packager.MappingsHelper._
mappings in Universal ++= directory(baseDirectory.value / "public")
那将包括您的公众' dist文件中的目录(您可以包含任何类似的目录)。然后您的应用程序将在生产环境中工作。
答案 1 :(得分:2)
答案 2 :(得分:0)
Play附带内置控制器来提供公共资产。
控制器在默认的Play JAR中可用作controls.Assets并定义一个具有两个参数的动作:
Assets.at(path:String,file:String) 必须修复path参数并定义该操作管理的目录。 file参数通常是从请求路径中动态提取的。
以下是conf / routes文件中Assets控制器的典型映射:
GET /assets/*file controllers.Assets.at(path="/public", file)
答案 3 :(得分:0)
有两种方法可以解决这个问题: - 1)直接使用Supun Wijerathne在上面的评论中提出的建议。 2)第二个是使用以下方法,如果一个人不想在应用程序的分发版本中添加额外的公共文件夹: - a)从conf文件夹中的公用文件夹中复制所有文件。 b)使用Play的类加载器将资源作为流获取。 c)使用Source.fromInputStream方法将此输入流转换为bufferedsource。现在,控制器可以使用该文件进行处理。
答案 4 :(得分:0)
找到解决方案:需要使用assets /
调用这些资源答案 5 :(得分:0)
如果使用的是Scala 2.12,请使用Source.fromResource而不是Source.fromFile。
示例:
如果将文件放在公用文件夹中,请不要使用斜杠。
Source.fromResource(“public/files/abc.txt”)
如果将文件放在conf文件夹中,请不要在路径中包含conf。
Source.fromResource(“files/abc.txt”) // conf/files/abc.txt
如果您使用的是Scala <2.12,则可以使用Java。有两种方法。
相对路径(无斜杠)
scala.io.Source.fromInputStream(getClass.getClassLoader.getResourceAsStream(“public/test.txt”))
绝对路径(需要斜杠)
scala.io.Source.fromInputStream(getClass.getResourceAsStream(“/public/test.txt”))
我想如果将文件放在conf文件夹中,您还必须在路径中排除“ conf”。
最后,您可以在此blog中了解Java的资源加载方式。