Playframework [Scala] : The app cannot access its assets in production

标签 playframework

在生产中运行我的应用程序时,我收到有关访问 Assets 的错误(在开发过程中工作正常):

[info] play.api.Play - Application started (Prod)
[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
[error] application - 

! @784kabl4n - Internal server error, for (GET) [/assets/images/favicon.png] ->

play.api.UnexpectedException: Unexpected exception[RuntimeException: java.lang.IllegalAccessError: class play.utils.Resources$ (in unnamed module @0x67dd1848) cannot access class sun.net.www.protocol.file.FileURLConnection (in module java.base) because module java.base does not export sun.net.www.protocol.file to unnamed module @0x67dd1848]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:251)
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:182)
    at play.core.server.AkkaHttpServer$$anonfun$2.applyOrElse(AkkaHttpServer.scala:343)
    at play.core.server.AkkaHttpServer$$anonfun$2.applyOrElse(AkkaHttpServer.scala:341)
    at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:414)
    at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
    at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
    at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91)
    at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
Caused by: java.lang.RuntimeException: java.lang.IllegalAccessError: class play.utils.Resources$ (in unnamed module @0x67dd1848) cannot access class sun.net.www.protocol.file.FileURLConnection (in module java.base) because module java.base does not export sun.net.www.protocol.file to unnamed module @0x67dd1848
    at play.api.mvc.ActionBuilder$$anon$2.apply(Action.scala:424)
    at play.api.mvc.Action.$anonfun$apply$2(Action.scala:96)
    at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$4(Accumulator.scala:174)
    at scala.util.Try$.apply(Try.scala:209)
    at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$3(Accumulator.scala:174)
    at scala.Function1.$anonfun$andThen$1(Function1.scala:52)
    at scala.Function1.$anonfun$andThen$1(Function1.scala:52)
    at scala.Function1.$anonfun$andThen$1(Function1.scala:52)
    at play.api.libs.streams.StrictAccumulator.run(Accumulator.scala:207)
    at play.core.server.AkkaHttpServer.$anonfun$runAction$4(AkkaHttpServer.scala:337)
Caused by: java.lang.IllegalAccessError: class play.utils.Resources$ (in unnamed module @0x67dd1848) cannot access class sun.net.www.protocol.file.FileURLConnection (in module java.base) because module java.base does not export sun.net.www.protocol.file to unnamed module @0x67dd1848
    at play.utils.Resources$.isUrlConnectionADirectory(Resources.scala:32)
    at controllers.AssetsBuilder.$anonfun$assetAt$3(Assets.scala:817)
    at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:304)
    at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
    at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70)
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68)
    at scala.concurrent.impl.Promise$DefaultPromise.dispatchOrAddCallback(Promise.scala:312)
    at scala.concurrent.impl.Promise$DefaultPromise.onComplete(Promise.scala:303)
    at scala.concurrent.impl.Promise.transformWith(Promise.scala:36)

我可以通过 http/https 访问应用程序本身,而 Nginx 充当代理,但 Play 应用程序本身似乎无法获取 Assets 。

关于 Assets 的路线是:

GET          /assets/*file             controllers.Assets.versioned(file)

View 中我有:

<head>
    <link rel="shortcut icon" type="image/png" href="@assetsFinder.path("images/favicon.png")">
</head>

知道如何调试这个吗?

最佳答案

好的,我找到了答案:我收到有关 java.base 的异常的原因是因为我使用的是 Play 不支持的 java-9-openjdk现在it seems ,而不是 java-8-openjdk

您可以阅读herehere如何在 Ubuntu 中设置和选择不同的 jdk 版本。

关于Playframework [Scala] : The app cannot access its assets in production,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50570264/

相关文章:

scala - Playframework 2.0 在 View 模板中定义函数

Playframework 2.0.3 - 每次编译后重新加载数据库驱动程序

mysql - Play Framework 2.5 - 不使用内存数据库进行测试

java - Play 2.4-Java - Actor 消息协议(protocol)最佳实践

scala - IntelliJ 似乎没有选择某些 sbt 库,没有代码完成

scala - 如何将文件名保存到数据库中

scala - play 框架中的服务器端 session

postgresql - Play 2's anorm can' t 在 postgresql 上工作

java - Play Framework (Java) 的数据库优先 ORM,具有自动 DB 模型生成功能

java - 执行依赖于其他任务的 CompletableFuture