工欲善其事,必先利其器。
<!--more-->前端
阅读源码最多见操做的就是在函数/方法的调用与定义之间跳转,对于只有大部分源码来讲,均可以经过ctags+vim得到比较好的体验,但对于Android源码这样10G多的大型项目,这种方法就捉襟见肘了,更没必要说对高度定制化的搜索需求(如查找某个文件的某个方法)的支持。
OpenGrok其实就是一个搜索引擎,只不过不一样于Google、Baidu面向的是网页,OpenGrok面向的是源码,经过创建索引,OpenGrok能够帮助咱们更好地在浩如烟海的源码里找到本身须要的那部分。java
环境搭建的繁琐程度和最终的便利性成反比,把源码解压出来,随便装一个文本编辑器就能够开始阅读源码了,可是若是你真的这样作就会发现即便查找某个函数/方法的声明都极其耗时,因此但愿读者接下来能够保持耐心,由于环境搭建对于源码阅读来讲是一件一劳永逸的事情。
对于自学能力强者,建议直接看官方文档:How to setup OpenGrok · oracle/opengrok Wikigit
什么要网页浏览器?由于OpenGrok本质是一个创建和处理索引的工具,就像ctags同样,咱们通常用的编辑器Vim其实充当了一个显示代码的前端的做用,这个里的网页浏览器其实功能就和Vim相似,用来显示代码。Vim可以直接解析ctags工具生成的tags文件,但网页浏览器却不能,因此须要一个Servlet(服务器端),用来处理查找方法、跳转到方法声明之类的操做所产生的请求,这里咱们选择tomcat,版本要求8+。安装过程以下:github
sudo apt-get install tomcat8 sudo /etc/init.d/tomcat8 restart
打开http://localhost:8080/看到相似下面的网页说明成功了:
web
最后下载OpenGrok,并把source.war
这个文件放在Tomcat的webapp目录下:vim
sudo cp ~/下载/opengrok-1.1-rc41/lib/source.war /var/lib/tomcat8/webapps
此时http://localhost:8080/source/应该就能访问了,可是可能会报一些错误,只要不是404就不要慌,继续配置。浏览器
官方明确要求JDK1.8及以上版本,若是版本低会报tomcat
An error occurred at line: 55 in the jsp file: /menu.jspf '<>' operator is not allowed for source level below 1.7
之类的错误,如何安装JDK的教程不少,不作赘述。
经过java -version
和javac -version
能够查看版本。服务器
必须是universal-ctags
,不然后面创建索引的时候会报错:oracle
严重: Exception running indexer org.opengrok.indexer.index.IndexerException: Didn't find Universal Ctags at org.opengrok.indexer.index.Indexer.prepareIndexer(Indexer.java:888) at org.opengrok.indexer.index.Indexer.main(Indexer.java:298)
通常经过apt-get
安装的都是exuberant-ctags
,要注意:
sudo apt-get install tags[TAB] exuberant-ctags geany-plugin-ctags libparse-exuberantctags-perl
能够直接下载universal-ctags
的源码来编译安装:
# prepare sudo apt-get remove ctags sudo apt-get autoremove sudo apt-get install autoconf sudo apt-get install automake git clone https://github.com/universal-ctags/ctags.git cd ctags ./autogen.sh ./configure make sudo make install
足够的硬盘空间。
OpenGrok会经过一个目录存放全部须要被索引的工程,经过一个目录存放索引,对于须要创建索引的源码,为了避免影响其余操做,咱们能够创建一个目录opengrok-workspace
(名字自定义,下同),将源码放在project
目录下,索引放在data
目录下。但这样直接移动源码实在不够优雅,其实project
目录存在的意义是让OpenGrok知道哪些工程须要被索引,因此咱们只需创建一个软连接(Windows下的快捷方式)就好了,这里我为Android源码、Vim源码和Git源码创建了软连接,表示我须要索引这三个工程:
cd ~/opengrok-workspace/project ln -s ~/SourceCode/Android_6.0/mydroid/ Android6.0 ln -s ~/SourceCode/git/ git ln -s ~/SourceCode/vim/ vim
效果以下:
~/opengrok-workspace/project $ ls Android6.0 git vim
这样咱们不想索引某个项目只须要移除他的软连接(几kb)就好了,而没必要移动项目自己(动辄几G)。
强烈建议经过java -jar ~/Install/opengrok-1.1-rc41/lib/opengrok.jar -h
查看每个参数的意义,好比我最终的命令是下面这样:
java -jar ~/Install/opengrok-1.1-rc41/lib/opengrok.jar -P -S -v -s ~/opengrok-workspace/project -d ~/opengrok-workspace/data -I *.java -I *.c -I *.h -I *.cpp -W ~/opengrok-workspace/configuration.xml
其中-s
代表项目地址,-d
代表索引输出地址,-W
代表配置输出地址,都是必须的。对于Git和Vim不要-I
参数可能都没有问题,但对于Android源码,若是不要这个参数产生的索引就会不可用,由于.jar
、.so
等文件都没法创建索引,因此这里我指定了只对Java和C、C++相关的文件创建索引,不只创建速度更快,占用空间也更小。
最后,去/var/lib/tomcat8/webapps/source/WEB-INF
目录配置CONFIGURATION
参数,让服务器端知道索引在哪:
...... <context-param> <description>Full path to the configuration file where OpenGrok can read its configuration</description> <param-name>CONFIGURATION</param-name> <param-value>/home/zhaoyu/opengrok-workspace/configuration.xml</param-value> </context-param> ......
按照上面的命令重启Tomcat服务器端使新的配置生效,最后大功告成:
本文只是介绍了环境的基本搭建流程,OpenGrok支持高度定制,这里只使用了最基本的参数。此外,前端和服务器端也能够根据本身的喜爱定制,例如asenac/vim-opengrok和jdevera/vim-opengrok-search都在尝试把Vim做为浏览代码的前端,固然在Chrome里面装个vimium
也能得到相似的体验。