私は Play 2.1.0 で olap4j を使用しようとしていますが、一部の 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
おそらく、グローバル クラスに JDBC クラス登録を追加する必要がありますか? どんな助けでも大歓迎です。org.olap4j.driver.xmla.XmlaOlap4jDriver の JavaDocs には次のように書かれています。これはまさに私がフォローしているものです。
olap4j は JDBC のスーパーセットであるため、他の JDBC ドライバーと同じようにこのドライバーを登録します。次に、接頭辞「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);
}
}