如何在这个简单的Play示例中使用非托管依赖项?

时间:2014-07-14 16:24:56

标签: scala build playframework-2.0

我正在尝试编写一个Scala Play Web服务,该服务返回JSON对象,但在依赖项中调用函数时遇到问题。有人可以告诉我在这个简化的例子中我做错了吗?

我有一个名为SimpleJSONAPI的项目,它包含以下对象。

package com.github.wpm.SimpleJSONAPI

import play.api.libs.json.{JsValue, Json}

object SimpleJSONAPI {
  def toJson(s: String): JsValue = Json.toJson(Map("value" -> s))
}

单元测试确认给定一个字符串它返回一个{"value":"string"}形式的JSON对象。

我通过键入play new PlayJSON创建了一个单独的Play 2.2.3 Scala项目。我在生成的应用程序中向控制器添加了以下json操作。

package controllers

import play.api.mvc._

import com.github.wpm.SimpleJSONAPI._

object Application extends Controller {

  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }

  def json = {
    val j = SimpleJSONAPI.toJson("The JSON API")
    Action {
      Ok(j)
    }
  }
}

我也添加了这条路线。

GET        /json                controllers.Application.json

在PlayJSON项目的根目录中,我有一个lib目录,其中包含SimpleJSONAPI构建的simplejsonapi_2.11.jar。这似乎包含正确的代码。

> jar tf lib/simplejsonapi_2.11.jar 
META-INF/MANIFEST.MF
com/
com/github/
com/github/wpm/
com/github/wpm/SimpleJSONAPI/
com/github/wpm/SimpleJSONAPI/SimpleJSONAPI$.class
com/github/wpm/SimpleJSONAPI/SimpleJSONAPI.class

这是编译,但是当我尝试连接到localhost:9000/json时,我在val j分配的行中遇到以下运行时错误。

java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(L/java/lang/Object;)Ljava/lang/Object;

我在使用/json行使FakeRequest路线的单元测试中也看到同样的错误。

如果我将toJson函数从外部依赖项复制到Play应用程序中,一切正常。

据我所知documentation我做的一切正确,错误信息是不透明的。有人能告诉我如何让它发挥作用吗?

2 个答案:

答案 0 :(得分:0)

考虑到您使用API​​的方式,我认为您的导入不正确。在导入...上排除对象名称

import com.github.wpm.SimpleJSONAPI._

或者更改您的使用情况以删除对象名称...

val j = toJson("The JSON API")

答案 1 :(得分:0)

这是Scala编译器版本兼容性的问题。我使用Scala 2.11编译了我的SimpleJSONAPI依赖项,而使用Scala 2.10构建了Play应用程序。当我将SimpleJSONAPI依赖项更改为使用Scala 2.10构建时,我能够在我的Play应用程序中使用它。

这很令人困惑,因为从项目文件中可以看出哪个版本的Scala Play应用程序正在使用,而且ArrowAssoc的错误消息并未表明它是编译器版本问题。