OpenGrok源码搜索引擎搭建

1. OpenGrok简介
有些情况下,我们需要在GB级别甚至几十GB级别且随时不断更新的大型代码(比如Android源码)里面搜索阅读源码,那么我们自然而然会有以下一些基本的需求:能够快速搜索代码,代码可存放于本地/服务器,代码之间可以跳转,跨平台,易于维护.显然SourceInsight、ctags、grep等工具在这些场景下就不太适合,于是有了OpenGrok这类代码搜索引擎。
先看看*对OpenGrok的介绍:
OpenGrok is a source code search and cross referenceengine. It helps programmers to search, cross-reference and navigate sourcecode 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  apache-tomcat-7.0.82.tar.gz

2.1 安装 exuberant-ctags
sudo apt-getinstall exuberant-ctags

2.2 安装 JDK
Ubuntu系统环境下JDK的安装可以参考以前的博文 Linux下安装配置JDK6,OpenGrok 0.12以后的版本,官网宣称已经不支持JDK6,这里可以安装更高版本的,比如JDK7,安装方式是一致的。(不过貌似我用JDK6也是用得好好的…)
安装openjdk7
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update  
sudo apt-get install openjdk-7-jdk

安装openjdk8
sudo apt-get install openjdk-8-jdk

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

sudo apt-get install tomcat8
由于后面Opengrok需要配置多个工程,需要修改到tomcat一些相关的参数,为了方便,这里选择手动下载安装包配置安装tomcat的方式。
(1). 首先到Tomcat官网(http://tomcat.apache.org/ )下载相应的安装包, 比如我下载的是 apache-tomcat-8.5.11.tar.gz
(2). 解压到某一目录下(比如我的是/home/nwpushuai/SoftWare/tomcat), 然后进入Tomcat的bin目录,启动Tomcat服务 
          cd /home/nwpushuai/SoftWare/tomcat/bin;sudo ./startup.sh
       注:startup.sh为启动Tomcat服务脚本,如果需要停止Tomcat服务,则执行同目录下的 shutdown.sh脚本即可。
(3). 检查Tomcat是否安装成功 
打开浏览器,访问地址:http://localhost:8080,如果能够显示以下的欢迎页面说明Tomcat配置成功。 
OpenGrok源码搜索引擎搭建

2.4 安装 OpenGrok
(1). 首先到OpenGrok官网下载相应的安装包, 比如我下载的是opengrok-0.12.1.5.tar.gz     
(2). 解压opengrok-0.12.1.5.tar.gz到某一目录下(比如我的是/home/nwpushuai/SoftWare/opengrok),然后进入opengrok目录,
     修改bin目录下的OpenGrok脚本
    OPENGROK_INSTANCE_BASE="${OPENGROK_INSTANCE_BASE:-/home/nwpushuai/SoftWare/opengrok}"   #opengrok的软件地址
    OPENGROK_TOMCAT_BASE="${OPENGROK_TOMCAT_BASE:-/home/nwpushuai/SoftWare/tomcat}" #tomcat的软件地址
    OpenGrok源码搜索引擎搭建

       拷贝lib目录下的source.war文件到tomcat的webapps文件夹中
       cd /home/nwpushuai/SoftWare/opengrok/lib;cp source.war /home/nwpushuai/SoftWare/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的源码,这个时候也可以进行搜索了:
        OpenGrok源码搜索引擎搭建
       比如在framework目录下搜索一下Android的恢复出厂设置API rebootWipeUserData,可以看出搜索结果秒出 
      OpenGrok源码搜索引擎搭建
     如果平时使用过程中只需要搜索一个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,一个是aosp源码,另外一个是mediatek源码,两个project是独立的,因此在OpenGrok使用过程互相不冲突。并且,两个project index过程中生成的数据是放在指定的目录下的,与源码目录隔离开来!
OpenGrok源码搜索引擎搭建
下面介绍一下多项目索引配置方法:
(1). Android源码目录: 
      /home/nwpushuai/Sources/Android/Google/aosp(aosp源码) 
      /home/nwpushuai/Sources/Android/Android_kernel/mediatek (mediatek源码) 

(2) Opengrok 索引过程生成的数据目录放到指定目录,与源码隔离开来
      /home/nwpushuai/SoftWare/OpenGrok_Sources/Android/Google/aosp(aosp索引数据存放目录)
      /home/nwpushuai/SoftWare/OpenGrok_Sources/Android/Android_kernel/mediatek(mediatek索引数据存放目录)

(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”

OpenGrok源码搜索引擎搭建

在启动 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} \ 
"${@}" 
}

OpenGrok源码搜索引擎搭建

(4). 为不同的project建立index (重点)
aosp: 
     export OPENGROK_INSTANCE_BASE="/home/nwpushuai/SoftWare/OpenGrok_Sources/Android/Google/aosp" #这是生成源码数据库文件的路径,非源码路径
     export OPENGROK_WEBAPP_NAME="aosp" #自定义webapp name
     export OPENGROK_TOMCAT_BASE="/home/nwpushuai/SoftWare/tomcat" #改成自己的tomcat路径
     /home/nwpushuai/SoftWare/opengrok/bin/OpenGrok deploy #不要加sudo,否则环境变量找不到
     /home/nwpushuai/SoftWare/opengrok/bin/OpenGrok index /home/nwpushuai/Sources/Android/Google/aosp #不要加sudo,否则环境变量找不到
     /home/nwpushuai/SoftWare/opengrok/bin/OpenGrok update /home/nwpushuai/Sources/Android/Google/aosp #不要加sudo,否则环境变量找不到

mediatek:
     export OPENGROK_INSTANCE_BASE="/home/nwpushuai/SoftWare/OpenGrok_Sources/Android/Android_kernel/mediatek" #这是生成源码数据库文件的路径,非源码路径
     export OPENGROK_WEBAPP_NAME="mediatek" #自定义webapp name
     export OPENGROK_TOMCAT_BASE="/home/nwpushuai/SoftWare/tomcat" #改成自己的tomcat路径
     /home/nwpushuai/SoftWare/opengrok/bin/OpenGrok deploy #不要加sudo,否则环境变量找不到
     /home/nwpushuai/SoftWare/opengrok/bin/OpenGrok index /home/nwpushuai/Sources/Android/Android_kernel/mediatek #不要加sudo,否则环境变量找不到
     /home/nwpushuai/SoftWare/opengrok/bin/OpenGrok update /home/nwpushuai/Sources/Android/Android_kernel/mediatek #不要加sudo,否则环境变量找不到
建立完各个projects的index,工作便完成90%以上了

(5) source.war分别重命名为aosp.war, mediatek.war,拷贝至tomcat webapps目录 
     cd /home/nwpushuai/SoftWare; 
     cp opengrok/lib/source.war tomcat/webapps/aosp.war; 
     cp opengrok/lib/source.war tomcat/webapps/mediatek.war;
于是,会自动生成aosp,mediatek两个目录

(6) 修改每个project目录WEB-INF/web.xml 
     原始的web.xml里面,param-name为”CONFIGURATION”的配置项里,param-value的值为/var/opengrok/etc/configuration.xml”,
     如下所示:
                     <param-name>CONFIGURATION</param-name><param-value>/var/opengrok/etc/configuration.xml</param-value>
      可以看到,OpenGrok默认寻找的index配置路径为/var/opengrok,因此,需要修改为我们的指定index路径: 
     也就是说,需要将param-value里面的值修改为
                       aosp:/home/nwpushuai/SoftWare/OpenGrok_Sources/Android/Google/aosp/etc/configuration.xml
                    mediatek:/home/nwpushuai/SoftWare/OpenGrok_Sources/Android/Android_kernel/mediatek/etc/configuration.xml

(7) 重启Tomcat
     /home/nwpushuai/SoftWare/tomcat/bin; sudo ./shutdown.sh; sudo ./startup.sh
     大功告成,OpenGrok安装搭建结束!
aosp Opengrok搜索: http://localhost:8080/aosp/
mediatek Opengrok搜索: http://localhost:8080/mediatek/

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



参考: