自行编译 saiku 的一些填坑记录

起因是说 jackson 的代码存在一个远程任意代码执行漏洞, http://bobao.360.cn/news/detai… ,而 saiku 又用到了 jackson,用的是 2.5.1

20170418114143

因此我们需要自行编译一个 saiku 的 pentaho 插件,把 jackson 的版本升上去

在此之前,我们用的是从 saiku 的官方下载回来的预编译好的 saiku-pentaho 插件,版本是 saiku-plugin-p7-3.11-SNAPSHOT

saiku 的代码拉下来之后是这样的

20170418114743

直接导入所有子工程到 eclipse 报错,例如出现以下的 error, Artifact has not been packaged yet. When used on reactor artifact, copy should be executed after packaging: see MDEP-187. (org.apache.maven.plugins:maven-dependency-plugin:2.8:copy:copy:package) pom.xml /saiku-bi-platform-plugin-p5 line 31 Maven Build Problem

Google 之后看到这里, http://blog.csdn.net/ahau10/ar… 说这个其实是 eclipse 的 maven 插件的问题

于是忽略,直接 skip test 跑 maven clean package,报错, Could not transfer artifact org.saikuanalytics:saiku-webapp:war:3.13 from/to Analytical Labs Repo (http://repo.meteorite.bi/repos…): connect timed out

这个第一反应就是公司内网的问题,在 .m2\settings.xml 里面给配置了 proxy 之后重试,依然无效,于是尝试用 Proxifier ,但是神器 Proxifier 只能走 socket 4 或者 5 的代理,要么就是 https,没有 http 的代理,我试着强制配了一个,也还是不行(这里其实引申出来一个问题,就是我们并不知道 mvn 在 package 的时候,对于一个具体的 denpendency,到底是从公司内网的 repo 拉取的,还是上公网拉取的,以及走没走代理,这些应该都是在 mvn 的参数里面可以有类似 verbose 的开关的,不过赶时间,没细究下去)

不过回头去看,编译的输出

[INFO] Saiku Module Project ............................... SUCCESS [  0.103 s]
[INFO] saiku - core libraries ............................. SUCCESS [  0.338 s]
[INFO] saiku olap util .................................... SUCCESS [  2.294 s]
[INFO] saiku-services ..................................... SUCCESS [ 47.300 s]
[INFO] saiku - web ........................................ SUCCESS [ 12.694 s]
[INFO] saiku-ui ........................................... SUCCESS [  4.776 s]
[INFO] saiku - webapp ..................................... SKIPPED
[INFO] saiku-server ....................................... FAILURE [01:31 min]
[INFO] saiku biserver plugin .............................. SUCCESS [ 14.063 s]
[INFO] saiku biserver plugin .............................. SUCCESS [  2.527 s]
[INFO] saiku biserver plugin .............................. SUCCESS [  3.291 s]

可以发现其实大部分还是能够编译过的,只有 saiku-server 这个是失败了,既然 saiku biserver plugin 能够编译过(上面的 maven 输出中没有输出版本号,其实 3 个 saiku biserver plugin 分别是 plugin 的 p5 p6 p7 版本),我们用的是 p7,那么直接在 p7 的 pom.xml 中修改 jackson 版本的 dependency,一开始配置了 jackson 的 2.9.0pr1,但是这个版本还在 pr 阶段,虽然能够 maven package 通过,出来一个插件的 zip 包,但是不知道会不会有潜在的问题

后来发现帖子中说 2.7.10 也修复了这个漏洞, http://bobao.360.cn/news/detai… ,于是改用 2.7.10,dependency 如下

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.7.10</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.7.10</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.7.10</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.7.10</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-base</artifactId>
  <version>2.7.10</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.module</groupId>
  <artifactId>jackson-module-jaxb-annotations</artifactId>
  <version>2.7.10</version>
</dependency>

然后尝试 mvn clean package,编译的时候可以发现他有类似这样的输出

[INFO] Downloading: http://repo.meteorite.bi/repository/alabs-release-local/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: http://repo.meteorite.bi/repository/alabs-snapshot-local/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: http://nexus.pentaho.org/content/repositories/proxied-3rd-party-releases/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: http://nexus.pentaho.org/content/repositories/pentaho-public-release-repos/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: http://nexus.pentaho.org/content/repositories/public-snapshots/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: https://repository.apache.org/content/repositories/snapshots/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: https://maven.atlassian.com/content/repositories/atlassian-public/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: http://repository.pentaho.org/artifactory/repo/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: http://clojars.org/repo/com/fasterxml/jackson/core/jackson-core/2.7.10/jackson-core-2.7.10.pom
[INFO] Downloading: http://repo.meteorite.bi/repository/alabs-release-local/com/fasterxml/jackson/core/jackson-annotations/2.7.10/jackson-annotations-2.7.10.pom
[INFO] Downloading: http://repo.meteorite.bi/repository/alabs-snapshot-local/com/fasterxml/jackson/core/jackson-annotations/2.7.10/jackson-annotations-2.7.10.pom
[INFO] Downloading: http://nexus.pentaho.org/content/repositories/proxied-3rd-party-releases/com/fasterxml/jackson/core/jackson-annotations/2.7.10/jackson-annotations-2.7.10.pom

可以看到,即使是对于 jackson 这种公开的库,他也依然优先走了 repo.meteorite.bi 和 nexus.pentaho.org 的 maven repo 去拉取,这样就导致速度上比较慢,这个估计是在某个 pom 文件中配置的 repo 的优先次序导致的

导致编译直接报错,Could not resolve dependencies for project org.saikuanalytics:saiku-bi-platform-plugin-p7:jar:3.13: Failed to collect dependencies at com.fasterxml.jackson.core:jackson-core:jar:2.7.10: Failed to read artifact descriptor for com.fasterxml.jackson.core:jackson-core:jar:2.7.10: Could not transfer artifact com.fasterxml.jackson.core:jackson-core:pom:2.7.10 from/to Analytical Labs Repo (http://repo.meteorite.bi/repository/alabs-release-local/): connect timed out -> [Help 1]

于是尝试把 saiku-tag-3.13\saiku-bi-platform-plugin-p7\pom.xml 中的 repositories 标签整个注释掉,依然失败,继续尝试把 saiku-tag-3.13\pom.xml 的 repositories 标签注释掉,这次倒是去公司内网的 maven 拉取了,但是报错拉取不到,于是排查了一下,发现 2.7.10 貌似还没上到 maven 仓库中

于是改回用 2.9.0pr1,同时把上面提到的注释重新打开

这次倒是可以打包成功过了,得到一个 saiku-plugin-p7-3.11.zip 的包,放到 \pentaho-server\pentaho-solutions\system 中,重启 pentaho 就可以了

但是发现 loading 一直转,进不去,打开 chrome 的控制台,发现错误如下

20170418103206

而官方预编译的包的前端输出如下

20170418103616

可以发现错误的根源就是那个 saiku.min.js 里面的抛出的异常,TabSet is not defined,跟到这个文件,在 \pentaho-server\pentaho-solutions\system\saiku\ui\saiku.min.js 发现自己打包出来的 saiku.min.js 文件只有 5k,而官方预编译的有 303k

跟踪可以发现,这个 saiku.min.js 来自 saiku-ui 工程,这个工程下面看到一个 gruntfile.js,可以说明他是用 grunt 来编译,grunt 是一个前端的编译工具,资料可以参考 http://javascript.ruanyifeng.c… 等文章,这个 grunt 里面坑比较多,估计暂时填不平,因此直接从官方的预编译包中拉出来一个 saiku.min.js 替换上去,就可以打开页面了,然后就是部署 saiku license 等例行工作了

至此,基本上就得到一个自行编译的带 jackson 2.9.0pr1 + 官方预置的 saiku.min.js 的混合包

——————–

2017-4-18 15:26:05 追加

关于 maven verbose 输出的问题,可以参考这里, http://stackoverflow.com/quest…

关于代理的问题,后来发现原因是公司的内网有两个代理,其中一个不行,另外一个专门给开发网使用的代理是可以工作的

Leave a Reply

Your email address will not be published. Required fields are marked *