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的方式。
(2). 解压到某一目录下(比如我的是/home/nwpushuai/SoftWare/tomcat), 然后进入Tomcat的bin目录,启动Tomcat服务
cd /home/nwpushuai/SoftWare/tomcat/bin;sudo ./startup.sh 注:startup.sh为启动Tomcat服务脚本,如果需要停止Tomcat服务,则执行同目录下的 shutdown.sh脚本即可。
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的软件地址
拷贝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的源码,这个时候也可以进行搜索了:
比如在framework目录下搜索一下Android的恢复出厂设置API rebootWipeUserData,可以看出搜索结果秒出
如果平时使用过程中只需要搜索一个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过程中生成的数据是放在指定的目录下的,与源码目录隔离开来!
下面介绍一下多项目索引配置方法:
(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” 在启动 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 (重点) 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开机自启动。 参考:
|