Java 播放Framework 2.1.0-使用Class.forName注册JDBC驱动程序时出现NoClassDefFoundError

Java 播放Framework 2.1.0-使用Class.forName注册JDBC驱动程序时出现NoClassDefFoundError,java,playframework,playframework-2.0,olap4j,Java,Playframework,Playframework 2.0,Olap4j,我试图在Play 2.1.0中使用olap4j,但在让一些olap4j代码在Play控制器中工作时遇到了很大的困难,同样的代码在单独的Eclipse Java项目中工作得很好,因此我排除了olap4j或它所连接的XMLA服务器的任何问题。通过将JAR文件放在\lib文件夹中,我将olap4j JAR文件添加为非托管依赖项。我正在播放开发模式下运行 以下代码返回以下异常: Java代码: Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver"

我试图在Play 2.1.0中使用olap4j,但在让一些olap4j代码在Play控制器中工作时遇到了很大的困难,同样的代码在单独的Eclipse Java项目中工作得很好,因此我排除了olap4j或它所连接的XMLA服务器的任何问题。通过将JAR文件放在\lib文件夹中,我将olap4j JAR文件添加为非托管依赖项。我正在播放开发模式下运行

以下代码返回以下异常:

Java代码:

Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
[RuntimeException: java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Callable] 
Play.application().classloader().loadClass("org.olap4j.driver.xmla.XmlaOlap4jDriver");
java.sql.SQLException: No suitable driver found for jdbc:xmla:Server=http://localhost/OLAP/msmdpump.dll
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);
}
}
错误:

Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
[RuntimeException: java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Callable] 
Play.application().classloader().loadClass("org.olap4j.driver.xmla.XmlaOlap4jDriver");
java.sql.SQLException: No suitable driver found for jdbc:xmla:Server=http://localhost/OLAP/msmdpump.dll
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);
}
}
在进一步挖掘之后,我发现Play使用了自己的类加载器,因此我尝试了以下方法:

Java代码:

Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
[RuntimeException: java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Callable] 
Play.application().classloader().loadClass("org.olap4j.driver.xmla.XmlaOlap4jDriver");
java.sql.SQLException: No suitable driver found for jdbc:xmla:Server=http://localhost/OLAP/msmdpump.dll
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);
}
}
这似乎消除了NoClassDefFoundError错误,但引发了以下异常:

错误:

Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
[RuntimeException: java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Callable] 
Play.application().classloader().loadClass("org.olap4j.driver.xmla.XmlaOlap4jDriver");
java.sql.SQLException: No suitable driver found for jdbc:xmla:Server=http://localhost/OLAP/msmdpump.dll
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);
}
}
也许我需要在全局类中添加JDBC类注册?任何帮助都将不胜感激。org.olap4j.driver.xmla.XmlaOlap4jDriver的JavaDocs说明了以下内容,这正是我所关注的:

由于olap4j是JDBC的超集,因此可以像注册任何JDBC驱动程序一样注册此驱动程序: Class.forName(“org.olap4j.driver.xmla.XmlaOlap4jDriver”); 然后使用前缀为“jdbc:xmla:”的URL创建连接

完整代码:

Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
[RuntimeException: java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Callable] 
Play.application().classloader().loadClass("org.olap4j.driver.xmla.XmlaOlap4jDriver");
java.sql.SQLException: No suitable driver found for jdbc:xmla:Server=http://localhost/OLAP/msmdpump.dll
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);
}
}
根据,您的第一种方法应该可以正常工作,例如:

Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
你所犯的错误

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

这意味着您还需要将
backport util concurrent.jar
添加到类路径中(如中所述)。我想在那之后应该可以用了。该jar是Backport并发Util jar,可用。将其也放入lib文件夹。

看起来您同时使用了olap4j和olap4j-jdk14。你只需要其中一个。

上帝保佑你!它正在工作,我还需要Retroweaver()。Eclipse&Play集成似乎存在一些问题,因为非web Java项目在Eclipse中没有额外的依赖项。非常感谢您的帮助。np:)需要这样的库有点奇怪,就好像您运行在某个遗留系统中一样(