Solr之修改和编译源代码

前言

上一次我介绍了一下怎么使用 Solr 搭建搜索引擎,按照计划,今天我们就要更进一步来介绍一下怎么修改和编译 Solr 的源代码。

我还是在 Mac 上编译和运行 Solr 源码,JDK 版本为 1.8,使用 Intellij IDEA 作为 IDE。

下载 Solr 源码

上次我们是在 Apache 官网上下载的 Solr 编译版,在那个下载的地方,同时还提供了源代码的下载。但是呢,今天我们并不去那边下载源代码,因为那里下载的源码不是在 Git 的管理之下的,不利于我们后续管理代码。毕竟我们不仅仅是为了下载来编译着玩的,而是真正用来做一些事情的,所以最好能维护一个自己的 Solr 分支。

所以我们去 GitHub 上 Apache 的主页上下载 Solr 的源码。具体的地址在这里:lucene-solr。GitHub 上面的 Solr 项目是 Apache 自己 Git 服务器上 Solr 项目的镜像,我们尽管 clone 这个项目即可。

1
$ git clone git@github.com:apache/lucene-solr.git

源代码比较大,如果网速不好,可能需要 clone 很久。

clone 完成后,我们看看项目根目录结构:

我们知道 Lucene 和 Solr 已经由两个项目合并成一个项目了,所以里面的 lucene 目录即包含了 Lucene 相关的源码,同样的 solr 目录包含了 Solr 相关的源码。dev-tools 是一些开发工具和一些脚本,build.xml 是 Ant 的编译配置文件,后面会说到,README.txt 就不说了。

创建自定义分支

我们使用 Git 默认的 clone 方式 clone 下来的项目只有 master 分支,可以使用 git branch 命令查看,只有一个 master 分支。而实际上 GitHub 上有许多的分支。但是这些分支我们也用不到,所以没有也没什么关系,只要 tag 都在就好。
为什么这么说呢?我们当前 clone 的是当前 master 上最新的代码,我么你知道现在 Solr 已经迭代更新到了 6.5 版本。但是我们可能不需要在这么新的版本。和上次一样,我还是选择在 5.5.2 的版本上进行编译开发。

1
$ git tag

使用查看 tag 的命令,我们可以看到许多的分支:

其他的分支对我们来说都是无用的,我们只要找到
5.5.2 版本对应的分支即可,可以看出来它就是我用红圈圈出来的 releases/lucene-solr/5.5.2

我们可以直接切换到该 tag 上面去查看其代码,但是一个 tag 就是一个快照,tag 上面的代码是不能修改和 commit 的。所以我们必须根据该 tag 来创建一个分支:

1
$ git branch tdlab-5.5.2 releases/lucene-solr/5.5.2

然后再切换到新创建的分支上:

1
$ git checkout tdlab-5.5.2

我们根据 releases/lucene-solr/5.5.2 这个 tag 创建了我们自己的分支 tdlab-5.5.2 之后我们就可以维护自己的这个分支,在它上面修改 Solr 的源代码了。

当然如果你想根据其他版本的代码来创建自己的分支也可以,步骤和上面一样。

安装 Ant 和 Ivy

之前我们说到根目录下的 build.xml 的时候提到了 Ant。Solr 这个项目是通过 Ant 和 Ivy 来管理的,其中 Ant 进行项目管理负责编译打包等工作,Ivy 来进行依赖管理。所以要开始编译 Solr 源码,我们首先需要下载 Ant 和 Ivy 这两个工具。

因为我用的是 Mac,所以我直接使用 Homebrew 来安装 Ant:

1
$ brew install ant

如果是 Ubuntu 也可以用 apt-get 的方式来安装,Windows 下可以直接下载 Ant 来安装,然后配置一下环境变量。

安装完 Ant 之后,执行以下 ant -version,如果能看到 Ant 的版本号,说明 Ant 安装成功:

至于 Ivy,我用的是 Ivy-2.4.0 版本。我们可以去 Apache 官网下载,选择里面的 apache-ivy-2.4.0-bin.zip。下载之后解压,我们需要的只是 ivy-2.4.0.jar 这个 jar 包。将该 jar 包放入 Ant 的 lib 目录下即可。

Homebrew 安装的软件一般都是放在 /usr/local/Cellar 下面。如果是用 Homebrew 安装的,我们可以去那边找到 Ant 目录,然后将 ivy-2.4.0.jar 放到其 lib 目录下。注意 Homebrew 安装的软件的内部目录结构会有点不一样,Ant 的 lib 目录在 {ant根目录}/{版本号}/libexec/lib

安装完 Ant 和 Ivy 之后,我们回到 Solr 源代码的目录,可以着手开始编译了。

在 Solr 源代码目录,直接执行 ant 命令,我们可以看到一系列的 task 菜单,红圈圈出来的 idea 就是用来将项目编译成 IDEA 项目的。

然后执行

1
$ ant idea

开始将项目设置成 IDEA 项目。

看到上述字样,表明我们已经成功将项目配置成了 IDEA 支持的项目,之后就可以用 IDEA 来打开该项目了。

当然还需要配置一下 JDK:

这样,以后我们就可以在 IDEA 上面开发和修改 Solr 源码了。

编译运行

Solr 现在还不能运行,还需要编译创建 Solr 服务。

进入 lucene-solr 目录下的 solr 目录,同样直接执行 ant 命令:

我们也可以看到许多 Ant 的 task,根据提示,我们执行

1
$ ant server

来创建 Solr 服务。

这个编译过程就比较久啦,就像我这次就编译了两分多钟:

理论上到这个时候呢,我们已经可以运行 Solr 了,和原先直接下载的发行版一样,我们使用 bin 目录下面的 solr 脚本来启动 Solr。
这个 solr 脚本这次在 lucene-solr/solr/bin 目录下。

原先我们直接使用 solr start 来启动 Solr,这里我们也可以这么做,但这种方式 Solr 运行在后台,我们没法直接查看 Solr 的运行日志。所以我们加上一些参数之后再运行,在 lucene-solr 目录下面执行下面的命令:

1
$ solr/bin/solr start -p 8988 -f -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8988"

这次 Solr 运行在 8988 端口,并且我们看到运行日志都打印了出来。

尝试打开 http://localhost:8988

我们看到了熟悉的界面,并且可以在中间看到当前版本的编译信息,到这里,简单地编译运行就可以了。

如果要关闭 Solr 服务,只要在命令行界面简单地 Ctrl+C 即可。

配置 .gitignore

有一个问题,我们必须要考虑到,之前编译和运行 Solr 会产生许多中间编译产物,这些文件,我们是不应该提交到 Git 上面去的,Solr 本身已经给我们配置了一份 .gitignore 文件,里面忽略了大部分不需要的文件。但是我们现在执行以下 git status 命令,可能还是会发现一些文件 Git 提示我们是否需要追踪:

仔细一看,这些文件我们也是不应该提交到 Git 仓库中的,.DS_Store 是 Mac 上面会生成的文件,solr/server/logs是 Solr 运行的日志文件,所以我们修改 .gitignore 文件:

1
$ vim .gitignore

增加下面两行语句,这两行语句不是固定的,可以根据你们自己要忽略的文件来写

保存之后退出,再次执行 git status,这次就只是提示我们.gitignore 修改了。然后我们 commit 这次修改,再次查看 status,工作区就干净了。

修改源码

下面说一下如果我们要修改源码,该怎么做,假如我们自定义了一个相似度算法,那么我们新建这么一个类,继承于 ClassicSimilarity

然后使用 Ant 进行编译,因为我们就修改了 Lucene 的 Core 包里面的东西,所以我们只要执行compile-core即可:

1
$ ant compile-core

可以看到 Ant 确实帮我们编译了刚刚新建的文件。

光这样还不行,我们还需要去 solr 目录下,重新编译创建 Solr 服务,否则 Solr 是无法知道我们新加入了那个文件的。

1
$ ant server

然后一番漫长等待之后编译成功,再次运行,就可以看到效果啦!

当然这个例子是没有什么效果的,但是步骤就是这个样子。

像这样子的改动,我们是应该要提交到 Git 仓库的,所以最后我们将改动 commit 到 Git 上,整个流程就结束啦。