我正在尝试将 olap4j 与 Play 2.1.0 一起使用,但很难让一些 olap4j 代码在 Play 控制器中工作,同样的代码在单独的 Eclipse Java 项目中工作得很好,因此我已经排除了 olap4j 的任何问题或它连接到的我的 XMLA 服务器。通过将 JAR 文件放在 \lib 文件夹中,我已将 olap4j JAR 文件添加为非托管依赖项。我在 Play DEV 模式下运行。
以下代码返回以下异常:
Java 代码:
Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
错误:
[RuntimeException: java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Callable]
在进一步挖掘之后,我发现 Play 使用它自己的 Classloader,所以我尝试了以下方法:
Java 代码:
Play.application().classloader().loadClass("org.olap4j.driver.xmla.XmlaOlap4jDriver");
这似乎消除了 NoClassDefFoundError 错误,但是引发了以下异常:
错误:
java.sql.SQLException: No suitable driver found for jdbc:xmla:Server=http://localhost/OLAP/msmdpump.dll
也许我需要在 Global 类中添加 JDBC 类注册?任何帮助将非常感激。org.olap4j.driver.xmla.XmlaOlap4jDriver 的 JavaDocs 说明了以下内容,这正是我所关注的:
由于 olap4j 是 JDBC 的超集,因此您可以像注册任何 JDBC 驱动程序一样注册此驱动程序: Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver"); 然后使用前缀为“jdbc:xmla:”的 URL 创建连接。
完整代码:
package controllers;
import play.Play;
import play.mvc.*;
import org.olap4j.*;
import org.olap4j.metadata.Member;
import java.sql.*;
public class Test extends Controller {
public static Result index() {
String server = "http://localhost/OLAP/msmdpump.dll";
String user = "user";
String password = "password";
String result = "0";
try {
//Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
Play.application().classloader().loadClass("org.olap4j.driver.xmla.XmlaOlap4jDriver");
try {
Connection connection = DriverManager.getConnection("jdbc:xmla:Server="+server, user, password);
} catch (SQLException e) {
result = e.getMessage();
}
} catch (ClassNotFoundException e) {
result = e.getMessage();
}
return ok(result);
}
}