0

我正在尝试将 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);
}
}
4

2 回答 2

1

根据此线程,您的第一种方法应该可以正常工作,例如:

Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");

你得到的错误,

java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Callable

意味着您还需要添加到您的类路径中(就像在这个线程backport-util-concurrent.jar中提到的那样)。我想它应该在那之后工作。该 jar 是 Backport Concurrent Util jar,可在其网站上找到。将它也放入您的 lib 文件夹中。

于 2013-04-10T22:16:19.710 回答
0

看起来您同时使用了 olap4j 和 olap4j-jdk14。你只需要两者之一。

于 2013-04-11T21:37:43.763 回答