我的播放应用程序是2.4.2。在开发人员模式中,我曾经使用Source.fromFile(“./ public / files / abc.json”)从后端控制器的公用文件夹中读取文件
当我将应用程序转换为生产模式时,我收到了File Not Found Exceptions。我发现公用文件夹在生产模式下打包在资产jar中。我能做什么才能在开发和生产模式下工作?
你试过这个Play Documentation 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文件中的'public'目录(您可以包含任何类似的目录)。然后您的应用程序将在生产环境中工作。
Play附带一个内置控制器来为公共资产提供服务。
控制器在默认的Play JAR中可用作controllers.Assets并使用两个参数定义单个动作:
Assets.at(path:String,file:String)必须修复path参数,并定义该操作管理的目录。通常从请求路径动态提取file参数。
以下是conf / routes文件中Assets控制器的典型映射:
GET /assets/*file controllers.Assets.at(path="/public", file)
有两种方法可以解决这个问题: - 1)直接使用Supun Wijerathne在上面的评论中提出的方法。 2)第二种方法是使用以下方法,如果不希望在应用程序的分发版本中添加额外的公用文件夹:-a)从conf文件夹中的公用文件夹复制所有文件。 b)使用Play的类加载器将资源作为流获取。 c)使用Source.fromInputStream方法将此输入流转换为bufferedsource。现在,控制器可以使用此文件进行处理。
找到解决方案:需要使用资产调用这些资源/
如果您使用的是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”。
最后,您可以了解Java的资源加载如何在此blog中运行。