我正在使用scalatra文档和sbt-assembly插件来创建一个独立的jar。它适用于我的本地机器(Debian Wheezy和OpenJdk 1.7.0),但在运行相同Jdk的远程EC2机器(Ubuntu 12.04.2 LTS)上失败。
异常消息是:
org.fusesource.scalate.util.ResourceNotFoundException: Could not load resource: [index.ssp]; are you sure it's within [/home/abc/src/main/webapp]?
at org.fusesource.scalate.servlet.ServletResourceLoader.createNotFoundException(ServletResourceLoader.scala:79)
at org.fusesource.scalate.util.ResourceLoader$class.resourceOrFail(ResourceLoader.scala:55)
at org.fusesource.scalate.servlet.ServletResourceLoader.resourceOrFail(ServletResourceLoader.scala:37)
at org.fusesource.scalate.util.UriResource.delegate(Resource.scala:91)
at org.fusesource.scalate.util.DelegateResource.text(Resource.scala:216)
at org.fusesource.scalate.ssp.SspCodeGenerator.generate(SspCodeGenerator.scala:152)
at org.fusesource.scalate.TemplateEngine.compileAndLoad(TemplateEngine.scala:750)
at org.fusesource.scalate.TemplateEngine.compileAndLoadEntry(TemplateEngine.scala:699)
at org.fusesource.scalate.TemplateEngine.liftedTree1$1(TemplateEngine.scala:419)
它说无法找到视图,但完全相同的jar文件可以在我的本地计算机上运行。
答案 0 :(得分:2)
您需要在嵌入式Jetty上设置正确的资源库。以下是三个选项:
按照https://stackoverflow.com/a/17913254/1590415
中的说明将资源附加到.jar文件val rb = getClass.getClassLoader.getResource("webapp").toExternalForm
context.setResourceBase(rb)
将资源放在文件系统上的文件夹中
val rb = "webapp"
context.setResourceBase(rb)
使用scalatra-sbt
插件,它有dist
任务,可创建.zip发行版。对于工作项目,请参阅here。您可以通过在SBT提示符下键入dist
来调用该任务。
val myDistSettings = DistPlugin.distSettings ++ Seq(
mainClass in Dist := Some("ScalatraLauncher"),
memSetting in Dist := "2g",
permGenSetting in Dist := "256m",
envExports in Dist := Seq("LC_CTYPE=en_US.UTF-8", "LC_ALL=en_US.utf-8"),
javaOptions in Dist ++= Seq("-Xss4m", "-Dfile.encoding=UTF-8")
)
根据我的经验,Jetty从.jar加载web资源的速度非常慢,因此最好将它们放在文件系统的文件夹中。选项2和3都从文件系统加载资源。