Mondrian在eclipse中的源码配置

时间:2023-01-21 17:26:24

本文主要参照此文,http://blog.csdn.net/kiki_hust/article/details/4228270,对作者表示感谢,但是有一点变化。

相关文章还有这篇,http://blog.csdn.net/gaoyusi4964238/article/details/5861296。


mondrian是什么,要在eclipse中配置源码环境的应该都知道吧,使用java写的rolap(联机分析处理)引擎,使用mdx语言实现查询,从关系数据库(RMDMS)中读取数据然后经过java api用多维的方式对结果进行展示。有时候并不是所有的情况都可以直接拿来用,需要修改部分或者增加部分功能,或者需要研究学习,则需要研究mondrian的源码。

在实验室待过一段时间,实验室有人的工作就是研究这个,对mondrian很感兴趣,觉得有必要研究一下。首先需要做的就是在eclipse中配置mondrian的环境。

1、jdk1.6及以上,eclipse,ant1.8了都,安装方法可参照这些文章,在此不细述java的环境安装。

jdk:  http://www.cnblogs.com/nicholas_f/articles/1494073.html

ant : http://www.cnblogs.com/philander/articles/1781355.html

2、获取mondrian源码

获取mondrian源码有两种方式,建议都使用,理由后面说,方法如下:

第一种,直接下载源码,地址http://sourceforge.net/projects/mondrian/,建议下一份。

第二种,eclipse安装svn然后从mondrian在github上的托管地址检出mondrian的源码。

eclipse安装svn也很简单。在eclipse的菜单help-->install new software,点击add,名字svn,地址http://subclipse.tigris.org/update_1.0.x,然后等待,然后select all,一路next下去,很简单就安装了svn。

接下来就可以导出mondrian的源码了。

eclipse的菜单file-->import,选择最下面的从svn检出项目,然后next,然后创建新的资源库位置,输入https://github.com/pentaho/mondrian,就等着,这个可能得个两三分钟,然后选择你要检出的版本。mondrian在github上托管了所有的代码,从第一个版本到现在的主开发版本。你可以从branches中选成熟一点的比如3.5.0.x的,也可以直接选trunk,大部分都是一样的,关于branches、tags、trunk的区别,可以参照51cto的文章介绍http://developer.51cto.com/art/201005/201718.htm。

然后确定,就等着下载下来mondrian的源码,这个一定要保证网络畅通。下载完之后,mondrian的源码就获取到了,接下来还有一些配置问题。

3、配置与编译。(接下来的部分大部分参照了上面说的那篇文章。)

开源的mondrian发布源码工程的时候并没有将全部的源码提交到工程中,所以构建中会确实一部分源码,但在工程中提供了mondrian.jar来处理,mondrian的源码工程中缺失的源码是由工具自动生产的,并且它提供了生产这些源码的过程,在build.xml中说明了如何生产。

下载到eclipse中的源码会缺失一些东西,之前也下载了一份源码,将源码中的WEB-INF/lib的中包全都拷贝到 mondrian的工程的lib目录中。

据提示的异常导入必要的 jar 包文件(最简单的方法是把所有的包导入: 右击工程——属性——Java Build Path——选择Libraries选项卡——Add JARs——导入lib下的所有jar,Add External JARS 选择包所在文件的路径。 

安装了ant编译工具之后,直接在eclipse中,选定mondrian的build.xml文件,然后run as ant build,等待,会输出很多编译信息,由于有部分东西需要下载,所以要保证网络连通。有时候第一次会编译不通过,build failed,不要灰心,多编译几次,有时候下载或者访问网络上的某些文件有问题,编译几次之后,build  successful就表示编译成功了。一般前几次需要十多分钟,如果编译成功一次之后,以后每次要编译就只需要三十秒左右,当然编译成功之后,不需要再编译了。

4、构建查询,测试程序。(根据自身构建过程,与原文章有较多出入)

在查询过程中,Mondrian将mdx语句转换成sql语句,用jdbc访问数据库,实现了立方体的缓存,这是其特点所在。Jpivot并不是对Mondrian提供的公共api的简单调用,而是自己对Mondrian再进行了封装,所以需要对Mondrian的api进行分析,跟踪和调试。

执行一次查询的步骤如下所示:(首先导入所需要的包:mondrian.olap.*)

新建一个包含main函数测试类,建立一个connection:

Connection conn=DriverManager.getConnection(String,null);

测试的String的内容为:(这个测试的数据库在工程目录中/mondrian-2.0/demo/access/MondrianFoodMart.mdb)

Access:"Provider=mondrian;Jdbc=jdbc:odbc:MondrianFoodMart;Catalog=/*这里是mondrian工程地址*/webapp/WEB-INF/queries/FoodMart.xml;JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver; "

在String中定义了数据库连接的参数,以及Schema文件的路径(CataLog)。

注意:1 Provider=mondrian这一句是必须的,mondrian生成connection的时候对provider的值进行了单独的检查,没有这一句或者provider为其他值,都会触发异常;

       2 第二个参数定义CataLog,若在String中已经定义,值为null

定义查询语句:String queryStr ="select {[Measures].[Unit Sales]} on columns from Sales

注意:查询语句必须遵守mdx语法,关于mdx语法将在后续文章中做详细解答。

然后利用connection生成一个Query对象:Query query = conn.paseQuery(queryStr);

再执行查询得到结果:Result result = conn.execute(query);

最后控制台打印结果:

PrintWriter pw = new PrintWriter(System.out);

result.print(pw);

pw.flush();

下面是我的测试代码,供参考:

package mytest; 

import java.io.PrintWriter; 
import java.sql.SQLException; 
import mondrian.olap.Connection; 
import mondrian.olap.DriverManager; 
import mondrian.olap.Query; 
import mondrian.olap.Result; 

public class MyTest { 
public static void main(String[] args) { 
String str = "Provider=mondrian;" 
+ "Jdbc=jdbc:odbc:MondrianFoodMart;" 
+ "Catalog=D:/javaworkspace/mondrian-2.0/webapp/WEB-INF/queries/FoodMart.xml;" 
+ "JdbcDrivers=sun.jdbc.odbc.JdbcOdbcDriver;"; 
Connection conn = DriverManager.getConnection(str, null); 
//定义查询语句,遵循mdx语法 
String queryStr = "select {[Measures].[Unit Sales]} on columns from Sales"; 
//利用connection生成一个Query对象 
Query query = conn.parseQuery(queryStr); 
@SuppressWarnings("deprecation") 
//执行查询得到结果: 
Result result = conn.execute(query); 
//控制台打印结果 
PrintWriter pw = new PrintWriter(System.out); 
result.print(pw); 
pw.flush(); 
System.out.println("successful!"); 


如果运行正确,会输出:

log4j:WARN No appenders could be found for logger (mondrian.olap.MondrianProperties).
log4j:WARN Please initialize the log4j system properly. 
Axis #0: 
{} 
Axis #1: 
{[Measures].[Unit Sales]} 
Row #0: 266,773 
successful! 

(上面两行是警告,查阅过mondrian作者的博客了,他自己说直接忽略)。

(提示有错误,忽略错误直接执行。)

注意:有一个比较大的问题,我不知道是不是下载的源码有问题。在mondrian.server.monitor这个包中,Event.java类中:

if (RolapUtil.MONITOR_LOGGER.isTraceEnabled()) { 
            try { 
                throw new Exception(); 
            } catch (Exception e) { 
                StringWriter sw = new StringWriter(); 
                e.printStackTrace(new PrintWriter(sw, true)); 
                this.stack = sw.toString(); 
            } 
        } else { 
            this.stack = null; 
        } 

有这么一个if,但是eclipse报错显示, RolapUtil.MONITOR_LOGGER并未定义isTraceEnabled()这个方法,所以为了测试,我先把这段注释掉了,只留下一句 this.stack = null;,可以出上面的运行结果,但是这个问题还未研究清楚,后续研究再说,也许是编译或者源码的问题。如果有人知道,烦请指教,谢谢。

至此,在eclipse中配置mondrian环境完成,可以进行接下来的研究工作了。