我正在解决在 Playframework 中使用 kyotocabinet 的问题。并发生以下错误。
我正在使用 Eclipse 和 playframework-1.2.3。并且kyotocabinet 是本机库,所以我使用它的Java-Binding。
重现代码很简单。在控制器中:
public static void somePage() {
DB db = new DB();//error occurred
render();
}
Internal Server Error (500) for request GET /
Execution exception (In /app/controllers/TestApp.java around line 45)
NoClassDefFoundError occured : Could not initialize class kyotocabinet.DB
play.exceptions.JavaExecutionException: Could not initialize class kyotocabinet.DB
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:229)
at Invocation.HTTP Request(Play!)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class kyotocabinet.DB
at controllers.TestApp.somePage(TestApp.java:45)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:546)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:500)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:476)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:471)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:159)
... 1 more
在 Eclipse 中构建已完成,但在运行时发生错误。
我猜是因为缺少kyotocabinet.dll。(仅找到jkyotocabinet.jar)我将kyotocabinet.dll 的位置配置为我的playframework 项目的Java Build Path > Source > Native Library Location。在其他项目中也很好。
如何在 playframework 中使用本机库?任何示例或教程?
Play.getFile 和 System.load 不起作用。
package controllers;
import play.Play;
import play.jobs.*;
@OnApplicationStart
public class Bootstrap extends Job {
public void doJob() {
String path = "D:/MyProject/lib/jkyotocabinet.dll";
Play.getFile(path);
//System.load(path); if this was enabled, following error occurred: "Native Library D:\MyProject\lib\jkyotocabinet.dll already loaded in another classloader". so I guess the dll was loaded.
System.out.println("bootstrap loaded");//this is displayed.
}
}
UnsatisfiedLinkError occured : no jkyotocabinet in java.library.path
这个日本博客告诉 Play!Framework 无法加载原生库。 http://d.hatena.ne.jp/hjym_u/20110702/1309609277
我已经尝试过这些:绝对路径、相对路径、System.load、System.loadLibrary、Play.getFile。
作为决定性的方法,我将 jkyotocabinet.dll 放到当前目录(D:/MyProejct/),并编写了这段代码。
public static void somePage(){
File f = Play.getFile("jkyotocabinet.dll");
if(f != null && f.isFile() && f.canRead() && f.canExecute()){//true
DB db = new DB();//error occured. it reached here.
}
render();
}
Execution exception
NoClassDefFoundError occured : Could not initialize class kyotocabinet.DB
Play.getFile 找到了路径“jkyotocabinet.dll”,所以 jkyotocabinet.dll 在当前目录中,所以 jvm 应该会自动找到它。
任何人都可以在 playframework 中使用 JNI?
最后,我可以使用 kyotocabinet 作为 PROD 模式,但不能使用 DEV 模式。
项目/conf/application.conf
#application.mode=dev
application.mode=prod