官网:https://community.meteorite.bi/
GitHub:https://github.com/OSBI/saiku
文档:https://saiku-documentation.readthedocs.io/en/latest/#open-source
本文中所使用的saiku版本为 3.x 版本
git clone git://github.com/OSBI/saiku.git
【如果下载速度太感人,可以查看 git clone下载速度慢解决办法 】
saiku自带的maven仓库下载地址可能会出现各种问题,比如503等
以下是我修改后的maven仓库地址【方便起见只贴了修改的地方】
<distributionManagement>
<repository>
<id>gitlab-mavenid>
<url>https://gitlab.com/api/v4/projects/14840263/packages/mavenurl>
repository>
<snapshotRepository>
<id>gitlab-mavenid>
<url>https://gitlab.com/api/v4/projects/14840263/packages/mavenurl>
snapshotRepository>
distributionManagement>
<pluginRepositories>
<pluginRepository>
<id>pentaho-third-partyid>
<url>http://nexus.pentaho.org/content/repositories/proxy-public-3rd-party-release/url>
pluginRepository>
pluginRepositories>
<repositories>
<repository>
<id>gitlab-mavenid>
<url>https://gitlab.com/api/v4/projects/14840263/packages/mavenurl>
repository>
<repository>
<id>saiku-groupid>
<url>https://nexus.nuiton.org/nexus/content/repositories/saiku-group/url>
repository>
<repository>
<id>pentaho-pentaho-third-partyid>
<url>http://nexus.pentaho.org/content/repositories/proxy-pentaho-public-release-group/url>
repository>
<repository>
<id>pentaho-public-third-partyid>
<url>http://nexus.pentaho.org/content/repositories/proxy-public-3rd-party-release/url>
repository>
repositories>
<plugins>
plugins>
<repositories>
<repository>
<id>saiku-groupid>
<url>https://nexus.nuiton.org/nexus/content/repositories/saiku-group/url>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>saiku-group2id>
<url>https://nexus.nuiton.org/nexus/content/repositories/saiku-group/url>
pluginRepository>
pluginRepositories>
<repositories>
<repository>
<id>gitlab-mavenid>
<url>https://gitlab.com/api/v4/projects/14840263/packages/mavenurl>
repository>
<repository>
<id>saiku-groupid>
<url>https://nexus.nuiton.org/nexus/content/repositories/saiku-group/url>
repository>
<repository>
<id>pentaho-pentaho-third-partyid>
<url>http://nexus.pentaho.org/content/repositories/proxy-pentaho-public-release-group/url>
repository>
<repository>
<id>pentaho-public-third-partyid>
<url>http://nexus.pentaho.org/content/repositories/proxy-public-3rd-party-release/url>
repository>
repositories>
public static String getMeasureGroup(Measure measure){
if(isMondrian(measure)){
MondrianOlap4jMeasure m = (MondrianOlap4jMeasure) measure;
/** 注释掉这里 */
/** try {
return ((RolapBaseCubeMeasure) m.member).getMeasureGroup().getName();
}
catch(Exception e){
return "";
}
catch(Error e2){
return "";
}
*/
}
return null;
}
public static boolean getHanger(RolapCubeDimension dim){
/** 这里改成true即可 */
return true;
}
// 在根目录下执行
mvn clean install -DskipTests
静静等待即可。
【如果提示mvn命令不存在,则需要先配置maven环境变量】
【如果改完上面的maven还报错,可以留言给我】
去除License验证信息需要修改以下几处源码
/**
* Get the saiku
* @summary Get the Saiku License installed on the current server
* @return A response containing a license object.
*/
@GET
@Produces({ "application/json" })
public Response getLicense() {
// 直接返回正确结果
// try {
// return Response.ok().entity(licenseUtils.getLicense()).build();
// } catch (IOException | RepositoryException | ClassNotFoundException e) {
// e.printStackTrace();
// }
return Response.serverError().build();
}
修改login,去掉验证代码
/* (non-Javadoc)
* @see org.saiku.web.service.ISessionService#login(javax.servlet.http.HttpServletRequest, java.lang.String, java.lang.String)
*/
public Map<String, Object> login(HttpServletRequest req, String username, String password ) throws LicenseException {
// Object sl = null;
// String notice = null;
HttpSession session = ((HttpServletRequest)req).getSession(true);
session.getId();
sessionRepo.setSession(session);
// try {
// sl = l.getLicense();
// } catch (Exception e) {
// log.debug("Could not process license", e);
// throw new LicenseException("Error fetching license. Get a free license from http://licensing.meteorite.bi. You can upload it at /upload.html");
// }
// if (sl != null) {
// try {
// l.validateLicense();
// } catch (RepositoryException | IOException | ClassNotFoundException e) {
// log.debug("Repository Exception, couldn't get license", e);
// throw new LicenseException("Error fetching license. Please check your logs.");
// }
if (authenticationManager != null) {
authenticate(req, username, password);
}
if (SecurityContextHolder.getContext() != null
&& SecurityContextHolder.getContext().getAuthentication() != null) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (authorisationPredicate.isAuthorised(auth)) {
Object p = auth.getPrincipal();
createSession(auth, username, password);
return sessionHolder.get(p);
} else {
log.info(username + " failed authorisation. Rejecting login");
throw new RuntimeException("Authorisation failed for: " + username);
}
}
return new HashMap<>();
}
需要更改process_session和check_session方法
check_session: function() {
// This authentication cookie is used only by Orbis authentication strategy
var authCookie = this.getCookie(Settings.ORBIS_AUTH.cookieName);
if (Settings.ORBIS_AUTH.hazelcast_enabled && authCookie && !this.atemptedToLoginByCookie) {
this.sessionid = 1;
this.username = authCookie;
this.password = authCookie;
this.atemptedToLoginByCookie = true;
// In this case we inject the proper license attributes
var ONE_YEAR = 31556952000;
/**
Settings.LICENSE = {
licenseType: 'Orbis',
expiration: Date.now() + ONE_YEAR
}
*/
this.login(authCookie, authCookie);
} else {
if (this.sessionid === null || this.username === null || this.password === null) {
var that = this;
this.clear();
this.fetch({ success: this.process_session, error: this.brute_force });
} else {
if (!this.atemptedToLoginByCookie) {
this.username = encodeURIComponent(options.username);
}
this.load_session();
}
}
},
process_session: function(model, response) {
if ((response === null || response.sessionid == null)) {
// Open form and retrieve credentials
Saiku.ui.unblock();
if (Settings.DEMO) {
this.form = new DemoLoginForm({ session: this });
} else {
this.form = new LoginForm({ session: this });
}
this.form.render().open();
} else {
this.sessionid = response.sessionid;
this.roles = response.roles;
this.isAdmin = Settings.ORBIS_AUTH.hazelcast_enabled || response.isadmin;
this.username = encodeURIComponent(response.username);
this.language = response.language;
if (typeof this.language != "undefined" && this.language != Saiku.i18n.locale) {
Saiku.i18n.locale = this.language;
Saiku.i18n.automatic_i18n();
}
/**
var license =new License();
license.fetch_license('api/license/', function(opt) {
if (opt.status === 'success') {
Settings.LICENSE = opt.data.toJSON();
}
if(Saiku.session.isAdmin) {
var quota = new LicenseQuota();
quota.fetch_quota('api/license/quota', function (opt) {
if (opt.status === 'success') {
Settings.LICENSEQUOTA = opt.data.toJSON();
}
});
}
});
*/
this.load_session();
}
return this;
},
去除升级提示,注释掉所有render的内容
render: function() { /* var self = this; var license = new License(); if(Settings.BIPLUGIN5){ if(Saiku.session.get("notice") != undefined && Saiku.session.get("notice")!=null && Saiku.session.get("notice")!=""){ $(this.el).append("
Notice:"+Saiku.session.get("notice")+""); } if (Settings.LICENSE.licenseType != undefined && (Settings.LICENSE.licenseType != "trial" && Settings.LICENSE.licenseType != "Open Source License")) { return this; } if (Settings.LICENSE != undefined && Settings.LICENSE.licenseType === "trial") { var yourEpoch = parseFloat(Settings.LICENSE.expiration); var yourDate = new Date(yourEpoch); self.remainingdays = self.daydiff(new Date(), yourDate); $(this.el).append("
You are using a Saiku Enterprise" + " Trial license, you have "+ self.remainingdays+" days remaining. Buy licenses online."); return self; } else { $(this.el).append(""); return self; } } else { if(Saiku.session.get("notice") != undefined && Saiku.session.get("notice")!=null && Saiku.session.get("notice")!=""){ $(this.el).append("You are using Saiku Community" + " Edition, please consider upgrading to Saiku Enterprise, or entering a sponsorship agreement with us to support development. " + "Or contribute by joining our community and helping other users!
Notice:"+Saiku.session.get("notice")+""); } if (Settings.LICENSE.licenseType != undefined && (Settings.LICENSE.licenseType != "trial" && Settings.LICENSE.licenseType != "Open Source License")) { return this; } if (Settings.LICENSE.licenseType === "trial") { var yourEpoch = parseFloat(Settings.LICENSE.expiration); var yourDate = new Date(yourEpoch); self.remainingdays = self.daydiff(new Date(), yourDate); $(this.el).append("
You are using a Saiku Enterprise" + " Trial license, you have "+ self.remainingdays+" days remaining. Buy licenses online."); return self; } else { $(this.el).append(""); return self; } } */ },You are using Saiku Community" + " Edition, please consider upgrading to Saiku Enterprise, or entering a sponsorship agreement with us to support development. " + "Or contribute by joining our community and helping other users!
去除之后重新打包即可
Saiku 自带的xerces,与jdk8中的JAX-B不兼容
-Dorg.xml.sax.parser="com.sun.org.apache.xerces.internal.parsers.SAXParser" -Djavax.xml.parsers.DocumentBuilderFactory="com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl" -Djavax.xml.parsers.SAXParserFactory="com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"
如果不想打包就更改的话,可以直接设置
System.setProperty("org.xml.sax.driver", "com.sun.org.apache.xerces.internal.parsers.SAXParser");
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
System.setProperty("javax.xml.parsers.SAXParserFactory","com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
或者在maven的tomcat插件里加上
<javax.xml.parsers.DocumentBuilderFactory>com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpljavax.xml.parsers.DocumentBuilderFactory>
<org.xml.sax.parser>com.sun.org.apache.xerces.internal.parsers.SAXParserorg.xml.sax.parser>
<javax.xml.parsers.SAXParserFactory>com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpljavax.xml.parsers.SAXParserFactory>
Error unmarshalling xml in java-8 “secure-processing org.xml.sax.SAXNotRecognizedException causing java.lang.IllegalStateException”