OpenGrok源码搜索引擎搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luzhenrong45/article/details/52734781

声明

版权声明:博文为原创内容,可以转载或引用,但须在明显位置标明原文作者和出处,未经同意不得擅自修改本文内容!博客地址:http://blog.csdn.net/luzhenrong45

1. OpenGrok简介

有些情况下,我们需要在GB级别甚至几十GB级别且随时不断更新的大型代码(比如Android源码)里面搜索阅读源码,那么我们自然而然会有以下一些基本的需求:

  • 能够快速搜索代码
  • 代码可存放于本地/服务器
  • 代码之间可以跳转
  • 跨平台
  • 易于维护

显然SourceInsight、ctags、grep等工具在这些场景下就不太适合,于是有了OpenGrok这类代码搜索引擎。

先看看维基百科对OpenGrok的介绍:

OpenGrok is a source code search and cross reference engine. It helps programmers to search, cross-reference and navigate source code trees. —— [ 维基百科]

大概的意思是说,OpenGrok是一个快速、便于使用的源代码搜索与对照引擎。它能够帮助我们搜索,对照,定位我们的源代码树。

OpenGrok 应该算是我目前所知道的最好用的代码搜索、浏览工具了。由于OpenGrok是基于数据库的搜索,在代码量巨大的情况下(比如整份Android源码),搜索速度比sourceinsight要快速得多。另外,OpenGrok还是OpenSolaris操作系统源文件浏览和搜索的工具。一直以来,我都是使用OpenGrok来搜索阅读Android系统的源代码。

目前网络上已经有使用OpenGrok对Android源码进行索引的搜索引擎,地址:http://androidxref.com
OpenGrok官方主页请参照:http://opengrok.github.io/OpenGrok/

闲话少说,下面记录一下OpenGrok的搭建过程。

2. OpenGrok安装

首先附上opengrok和tomcat的下载链接:

opengrok-0.12.1.5.tar.gz 链接:http://pan.baidu.com/s/1qXGE1pa 密码:xysf
apache-tomcat-7.0.40.tar.gz 链接:http://pan.baidu.com/s/1pLuCcaR 密码:fisr

2.1 安装 exuberant-ctags


sudo apt-getinstall exuberant-ctags

2.2 安装 JDK

Ubuntu系统环境下JDK的安装可以参考以前的博文 Linux下安装配置JDK6,OpenGrok 0.12以后的版本,官网宣称已经不支持JDK6,这里可以安装更高版本的,比如JDK7,安装方式是一致的。(不过貌似我用JDK6也是用得好好的…)

2.3 安装Web服务器—-Tomcat

OpenGrok是一个Web系统,因此要共享OpenGrok搜索引擎,需要安装Web服务器,这里使用Tomcat。Tomcat的安装可以直接使用命令安装, 也可以选择手动下载配置。

命令安装方式为:

sudo apt-get install tomcat6

由于后面Opengrok需要配置多个工程,需要修改到tomcat一些相关的参数,为了方便,这里选择手动下载安装包配置安装tomcat的方式。

(1). 首先到Tomcat官网(http://tomcat.apache.org/ )下载相应的安装包, 比如我下载的是 apache-tomcat-7.0.70.tar.gz

(2). 解压到某一目录下(比如我的是/home/lzr/opengrok-laolu/tomcat), 然后进入Tomcat的bin目录,启动Tomcat服务

cd /home/lzr/opengrok-laolu/tomcat/bin
sudo ./startup.sh

注:startup.sh为启动Tomcat服务脚本,如果需要停止Tomcat服务,则执行同目录下的 shutdown.sh脚本即可。

(3). 检查Tomcat是否安装成功
打开浏览器,访问地址:http://localhost:8080,如果能够显示以下的欢迎页面说明Tomcat配置成功。
3

2.4 安装 OpenGrok

(1). 首先到OpenGrok官网下载相应的安装包, 比如我下载的是 opengrok-0.11.1.tar.gz

(2). 解压opengrok-0.11.1.tar.gz 到某一目录下(比如我的是/home/lzr/opengrok-laolu/opengrok), 然后进入opengrok目录,拷贝lib目录下的source.war文件到tomcat的webapps文件夹中


cd /home/lzr/opengrok-laolu/opengrok/lib
cp source.war /home/lzr/opengrok-laolu/tomcat/webapps/

source.war会自动解压成source目录,里面即为OpenGrok的默认配置参数。
打开浏览器,访问地址:http://localhost:8080/source/,可以看到OpenGrok的默认搜索页面,由于还没有建立源码索引,此时还不能搜索源码。

(3). OpenGrok开始deploy部署
OpenGrok可执行文件位于bin目录下,执行时带deploy参数即可开始部署

cd path_to_opengrok_bin # path_to_opengrok_bin指的是opengrok的bin目录
./OpenGrok deploy

(4). OpenGrok建立index索引
deploy之后,就可以开始为源代码建立OpenGrok索引了,这是OpenGrok与源代码之间真正的建立起联系,索引建

cd path_to_opengrok_bin # path_to_opengrok_bin指的是opengrok的bin目录
./OpenGrok index [path_to_src_code] # path_to_src_code指的是需要建立索引的源码路径

建立index的时间比较长,视源码大小而定,比如Android4.4的源码,使用本人的机器建立index大约耗时1小时。
index建立结束后,默认的OpenGrok配置就算完成了,重新访问地址:http://localhost:8080/source/,便可以发现Opengrok搜索界面右侧,已经出现了Android4.4的源码,这个时候也可以进行搜索了:

4

比如在framework目录下搜索一下Android的恢复出厂设置API rebootWipeUserData,可以看出搜索结果秒出
2
如果平时使用过程中只需要搜索一个project的源码,那么,做完以上操作就可以了,接下来的可以不看。

3. OpenGrok多项目索引配置

3.1 OpenGrok默认安装的缺陷

按照以上默认的OpenGrok安装方法,会存在一些缺陷,比如:

  • OpenGrok只能索引一个project,无法同时索引多个project
  • project名称默认指定为”source”,不够个性化
  • index过程中会生成好几个数据目录,比如data, log, etc…, 而且这些目录居然是存放在源码目录下的,与源码目录混淆(而且个人感觉这样不好,破坏了原来相对比较独立的源码目录)

由于我在平时的学习开发过程中,经常需要接触不同的Android源代码,比如RK3288的Android4.4和Android5.1源代码,因此有索引多个project的需求。

3.2 OpenGrok多项目索安装配置

如果需要使用OpenGrok配置索引多个project, 就需要对OpenGrok进行一定的定制修改了。发现网上的教程大多是鱼龙混杂,试了几个都是不靠谱的,遇到了好些问题,折腾了好几天,这才搞定。之所以写这篇博文,其实也纯粹是为了记录OpenGrok多项目索引配置安装方法!

先上一下效果图, OpenGrok同时配置了两个project,一个是rk3288 android4.4源码,另外一个是android5.1源码,两个project是独立的,因此在OpenGrok使用过程互相不冲突。并且,两个project index过程中生成的数据是放在指定的目录下的,与源码目录隔离开来!

1

下面介绍一下多项目索引配置方法:

(1). Android源码目录:

/home/lzr/android/source/firefly-rk3288/firefly-rk3288-kitkat (RK3288 Android4.4源码)
/home/lzr/android/source/firefly-rk3288/firefly-rk3288-lollipop (RK3288 Android5.1源码)

src_projects


(2) Opengrok 索引过程生成的数据目录放到指定目录,与源码隔离开来

/home/lzr/opengrok-laolu/source/firefly-rk3288/firefly-rk3288-kitkat (Android4.4索引数据存放目录)
/home/lzr/opengrok-laolu/source/firefly-rk3288//firefly-rk3288-lollipop (Android5.1索引数据存放目录)

opengrok_projects


(3) 修改OpenGrok脚本

前面说到,在默认的OpenGrok 脚本中,不支持除了source以外的webapp名字。因此,需要修改一下这个脚本以增加对其他的webapp name的支持。
OpenGrok增加一个新的环境变量OPENGROK_WEBAPP_NAME。如果没有在外部定义,则还是使用默认的 “source”

OPENGROK_INSTANCE_BASE=”${OPENGROK_INSTANCE_BASE:-/var/opengrok}”
+++ OPENGROK_WEBAPP_NAME="${OPENGROK_WEBAPP_NAME:-source}"
LOGGER_CONFIG_FILE=”logging.properties”

在启动 Java -jar opengrok.jar的时候加入 -w参数

StdInvocation()
{
${DO} ${JAVA} ${JAVA_OPTS} ${PROPERTIES} \
${LOGGER_PROPERTIES} \
...
${MAX_INDEXED_WORDS} ${SKIN} ${LEADING_WILDCARD} \
${READ_XML_CONF} \
-W ${XML_CONFIGURATION} \
${WEBAPP_CONFIG} \
-s ${SRC_ROOT} -d ${DATA_ROOT} \
+++ -w ${OPENGROK_WEBAPP_NAME} \
"${@}"
}

(4). 为不同的project建立index (重点)

Android4.4 Kitkat:

export OPENGROK_INSTANCE_BASE="/home/lzr/opengrok-laolu/source/firefly-rk3288/firefly-rk3288-kitkat" #这是生成源码数据库文件的路径,非源码路径
export OPENGROK_WEBAPP_NAME="firefly-rk3288-kitkat" #自定义webapp name
export OPENGROK_TOMCAT_BASE="/home/lzr/opengrok-laolu/apache-tomcat-7.0.40" #改成自己的tomcat路径
/home/lzr/opengrok-laolu/opengrok/bin/OpenGrok deploy #不要加sudo,否则环境变量找不到
/home/lzr/opengrok-laolu/opengrok/bin/OpenGrok index /home/lzr/android/source/firefly-rk3288/firefly-rk3288-kitkat #不要加sudo,否则环境变量找不到

Android5.1 Lollipop:

export OPENGROK_INSTANCE_BASE="/home/lzr/opengrok-laolu/source/firefly-rk3288/firefly-rk3288-lollipop"
export OPENGROK_WEBAPP_NAME="firefly-rk3288-lollipop" #自定义webapp name
/home/lzr/opengrok-laolu/opengrok/bin/OpenGrok deploy
/home/lzr/opengrok-laolu/opengrok/bin/OpenGrok index /home/lzr/android/source/firefly-rk3288/firefly-rk3288-lollipop

建立完各个projects的index, 工作便完成90%以上了


(5) source.war分别重命名为firefly-rk3288-kitkat.war, firefly-rk3288-lollipop.war,拷贝至tomcat webapps目录

cd /home/lzr/opengrok-laolu/
cp opengrok/lib/source.war tomcat/webapps/firefly-rk3288-kitkat.war
cp opengrok/lib/source.war tomcat/webapps/firefly-rk3288-lollipop.war

于是,会自动生成firefly-rk3288-kitkat,firefly-rk3288-lollipop两个目录


(6) 修改每个project目录WEB-INF/web.xml
原始的web.xml里面,param-name为”CONFIGURATION”的配置项里,param-value的值为
“/var/opengrok/etc/configuration.xm”, 如下所示:

<param-name>CONFIGURATION</param-name>
<param-value>/var/opengrok/etc/configuration.xml</param-value>

可以看到,OpenGrok默认寻找的index配置路径为/var/opengrok,因此,需要修改为我们的指定index路径:
也就是说,需要将param-value里面的值修改为/home/lzr/opengrok-laolu/source/firefly-rk3288/firefly-rk3288-kitkat/etc/configuration.xml
(lollipop同理进行修改)


(7) 重启Tomcat

/home/lzr/opengrok-laolu/tomcat/bin
sudo ./shutdown.sh
sudo ./startup.sh

大功告成,OpenGrok安装搭建结束!

Android4.4 Opengrok搜索: http://localhost:8080/firefly-rk3288-kitkat/
Android5.1 Opengrok搜索: http://localhost:8080/firefly-rk3288-lollipop/

剩下一些事儿

  1. 设置Tomcat开机自启动
    从前面的介结可以知道,tomcat服务是通过startup.sh脚本启动的,每次重启,都需要重新执行startup.sh脚本才能使用tomcat服务,比较繁琐。可以需要设置一下Tomcat开机自启动。
    参考Linux下Tomcat开机自动启动

参考文章:

工具之OpenGrok的搭建方法

OpenGrok中多项目配置方法

Linux下Tomcat开机自动启动

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页