Sbt dist cause no access to unmanaged resources?
对于我的sbt-play / scala应用程序,我在开发时一直在使用sbt run。
几乎完成了我的项目,现在我想将sbt dist用于生产目的。
(如果这是个坏主意,请纠正我。)
我的问题在这里。
运行sbt时,我可以通过添加
来访问非托管资源
1
| unmanagedResourceDirectories in Assets += baseDirectory.value /"works" |
到我的build.sbt
但是,在sbt dist之后,相同的网址不再起作用,并向我发送404 not found错误。
1
| Not Found For request 'GET /assets/RAW/abc.png' |
此" works"文件夹包含将在服务期间生成的文件,该文件与通常的" public"文件夹是分开的目录。
这是我的路线供参考。
1 2
| GET /assets/*file controllers.Assets.at(path="/public", file)
GET /works/*file controllers.Assets.at(path="/works/", file) |
sbt-dist是否需要build.sbt中的任何其他代码,或者我应该解决什么问题?
好的,这就是我解决问题的方法。
经过数小时(可能数天)的研究,我能够通过在控制器sendfile(new file(filename), inline=true)
中添加新功能来访问外部文件
我还必须设置路线。就我而言
GET / download /:id /:name controllers.DownloadTask.download(id:字符串,name:字符串)
在客户端中添加此url /路由信息后,效果很好。
通过unmanagedResourceDirectories
指定的其他资产目录
1
| unmanagedResourceDirectories in Assets += baseDirectory.value /"works" |
根据文档,
也将从public中投放:
A nuance with sbt-web is that all assets are served from the public
folder... note that the files there will be aggregated into the target public folder
这意味着您需要从
更改GET /works路线
1
| GET /works/*file controllers.Assets.at(path="/works/", file) |
至
1
| GET /works/*file controllers.Assets.at(path="/public", file) |
现在应该可以同时访问两个其他资产
1 2
| http://example.com/assets/RAW/abc.png
http://example.com/works/RAW/abc.png |
您可以通过将生成的程序包解压缩到.../target/universal,然后在lib目录下以-assets.jar结尾的列表中列出jar的内容,来确认在sbt dist之后其他资产最终在public下,例如:
1
| jar tf target/universal/play-scala-starter-example-1.0-SNAPSHOT/play-scala-starter-example.play-scala-starter-example-1.0-SNAPSHOT-assets.jar |
- 从get / works / * file获取/ works路由以获取/ works / * file?
-
已在公共场所拥有默认资源文件夹。我还应该给其他路线一个相同的路径吗?这些文件位于Works目录下。
-
@min是的,因为Play会汇总其他资产路径,例如public下的works,尽管您将其放在单独的works目录中。
-
我现在要去我的办公室,如果可以的话,会及时通知您。谢谢你分钟38分钟前
-
这会导致与先前的资产发生冲突。 [错误] \\ t <link rel =" stylesheet" href ='@ routes.Assets.at(" / public"," css / web / style.css")'>
-
[错误]/home/min/project_web-1.0.1/target/scala-2.12/twirl/main/vie??ws/html/admn/errors。??template.scala:31:参数过多(2)方法位于:(file:String)play.api.mvc.Call次47.其他错误消息:[错误] <link rel =" stylesheet" href ='@ routes.Assets.at(" / public"," css / error.css")'> [错误] ^它基本上发生在我称为公共文件的任何地方。
-
我不完全了解资产的想法最终出现在公用文件夹中。他们不应该成为目标并像在公众面前一样运作吗?我认为因为sbt-dist之后目标不再存在,所以我以前的在网页中加载资源的工作失败了。
-
如果仅向at提供单个参数,会发生什么情况:@routes.Assets.at("css/web/style.css")
-
[错误] /home/min/project_web-1.0/app/views/web/main.scala.html:42:方法的参数不足:(path:String,file:String)play.api.mvc.Call。 [错误]未指定的值参数文件。 [错误] <script src =" @ routes.Assets.at(" js / web / pace.js")" type =" text / javascript">
-
也许解压缩位置是这里的问题?我应该在目标/通用下解压缩之后的sbt-dist吗?但这可能会严重破坏我的代码的结构。.我正在解压缩此发行版。与我的开发人员处于同一水平。
-
如果解压缩该软件包,是否可以在lib/*-assets.jar中的works中看到您的资产?您可以使用jar tf列出jar的内容。
-
是的,我可以看到我的作品目录中的内容。但问题是我在实际运行该应用程序时将更多文件动态添加到此目录中。
-
我知道了。您是否考虑过按照以下建议将这些动态生成的资产存储在外部目录中:stackoverflow.com/questions/22146586/…
-
该答案提供了为静态资源提供服务的Action`,以及与动态资源相关的我的案例?我认为这个话题正在朝着不同的方向发展。问题是:1.我试图通过URL URL:9000 / assets / min / abc.png通过URL访问动态资源访问(在编译和分发后创建文件,用户上传)2.在sbt运行时与Assests中的unmanagedResourceDirectories一起正常工作3 。当使用相同名称的sbt dist和unzip解压缩时,无法访问文件。
-
还是应该在解压缩的通用发行版./bin/project_web -Dhttp.port = 9001时添加一些代码来激活build.sbt?
-
好的。因此,只要我可以访问sbt dist之前生成的正在工作的旧文件。但不适用于正在工作的,在sbt dist之后生成并由./bin/project_web执行并由用户添加的新文件。