声明
版权声明:博文为原创内容,可以转载或引用,但须在明显位置标明原文作者和出处,未经同意不得擅自修改本文内容!博客地址: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配置成功。
###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的源码,这个时候也可以进行搜索了:
比如在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,一个是rk3288 android4.4源码,另外一个是android5.1源码,两个project是独立的,因此在OpenGrok使用过程互相不冲突。并且,两个project index过程中生成的数据是放在指定的目录下的,与源码目录隔离开来!
下面介绍一下多项目索引配置方法:
(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源码)
(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索引数据存放目录)
(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/
剩下一些事儿
- 设置Tomcat开机自启动
从前面的介结可以知道,tomcat服务是通过startup.sh脚本启动的,每次重启,都需要重新执行startup.sh脚本才能使用tomcat服务,比较繁琐。可以需要设置一下Tomcat开机自启动。
参考《Linux下Tomcat开机自动启动》
参考文章:
修改说明
作者 | 版本 | 修改时间 | 修改说明 |
---|---|---|---|
WalkAloner | V1.0 | 2016/10/04 | 第一版 |
WalkAloner | V1.1 | 2019/07/26 | 图床搬迁 |