在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码
OpenGrok 是一个快速,便于使用的源码搜索引擎与对照引擎,它能够帮助我们快速的搜索、定位、对照代码树。接下来就具体讲解 Ubuntu 16.04 LTS
环境下 OpenGrok
的安装及使用,目前最新的 OpenGrok 1.3.11/1.3.16
依赖 Java 1.8
, Tomcat 8
。
1.依旧参照 UBUNTU 13.10 APACHE 2.2 通过 AJP 整合 TOMCAT 7 中讲述的方法,进行 Tomcat 8
, Apache 2.4
的配置安装,只不过路径中的 Tomcat7
目录替换成 Tomcat8
。
2.安装 Tomcat 8
1
2
3
4
5
6
7
8
9
|
$ sudo apt–get install tomcat8
# 一般卸载 tomcat7
$ sudo apt–get remove
# 调整内存,默认的128MB 默认配置运行会导致OOM
$ sudo touch /usr/share/tomcat8/bin/setenv.sh
$ echo ‘export JAVA_OPTS=”-Xms512M -Xmx1024M”‘ | sudo tee –a /usr/share/tomcat8/bin/setenv.sh
|
3.安装 universal-ctags
用于对 C\C++
代码的支持
给代码建立索引时,要使用到universal-ctags
工具,但是一般通过apt-get安装的都是exuberant-ctags
,所以要先删除原有的ctags版本,然后安装universal-ctags
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
$ sudo apt–get purge ctags
$ sudo apt–get install git
$ sudo apt–get install autoconf
$ sudo apt–get install pkg–config
$ cd ~
$ git clone
$ cd ctags
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ cd ..
$ rm –rf ctags
|
4.下载并安装OpenGrok
可以到”https://oracle.github.io/opengrok/“手工下载文件,然后上传到服务器,也可以直接用wget
命令来下载,一般选择安装在”/opt
“目录下面。
1
2
3
4
5
6
7
|
$ sudo apt–get install aria2
$ cd /opt
$ sudo aria2c –c “https://github.com/oracle/opengrok/releases/download/1.3.11/opengrok-1.3.11.tar.gz”
# sudo aria2c -c “https://github.com/oracle/opengrok/releases/download/1.3.16/opengrok-1.3.16.tar.gz”
|
解压缩文件到当前目录”/opt
“
1
2
3
|
$ sudo tar xvf opengrok–1.3.11.tar.gz
# sudo tar xvf opengrok-1.3.16.tar.gz
|
创建一个软链接,方便后续的修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$ sudo ln –s opengrok–1.3.11 /opt/opengrok
# sudo ln -s opengrok-1.3.16 /opt/opengrok
# 安装工具,必须是Python3 ,Python2 安装会失败
$ sudo apt–get install python3–pip
$ sudo pip3 install
# 如果报错 ModuleNotFoundError: No module named ‘pip._internal’
# 执行如下命令
# sudo python3 -m pip install –upgrade pip
# 解决 AttributeError: module ‘setuptools.dist’ has no attribute ‘check_specifier’
$ sudo pip3 install
$ sudo pip3 install /opt/opengrok/tools/opengrok–tools.tar.gz
|
链接”/opt/opengrok/lib/source.war
“到 Tomcat8
的工程目录”/var/lib/tomcat8/webapps/
“,比如我们有多个源代码工程,建议进行链接操作。如下:
1
2
3
4
5
6
7
|
$ sudo ln –s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_4.2.2.war
$ sudo ln –s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_7.0.0_r21.war
$ sudo ln –s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_10.0.0_r40.war
$ sudo ln –s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Chromium.war
|
访问”http://localhost:8080/source/“确认OpenGrok是否已经安装成功,如果安装成功,出现下面的界面:
5.出于安全原因,禁止外网访问Tomcat的8080端口
只允许Tomcat在本地的8080端口监听即可,修改
1
|
$ sudo vim /var/lib/tomcat8/conf/server.xml
|
添加 address="127.0.0.1"
/var/lib/tomcat8/conf/server.xml
XHTML
1
2
3
|
<Connector port=“8080” address=“127.0.0.1” protocol=“HTTP/1.1”
connectionTimeout=“20000”
redirectPort=“8443” />
|
重启Tomcat8
1
|
$ sudo service tomcat8 restart
|
6.配置Apache2对Tomcat通过AJP进行反向代理
Apache2
的配置文件“ /etc/apache2/sites-enabled/000-default.conf
” (如果开启了HTTPS,则需要同步修改 /etc/apache2/sites-enabled/000-default-le-ssl.conf
或者 /etc/apache2/sites-enabled/default-ssl.conf
) 中,增加如下配置:
/etc/apache2/sites-enabled/000-default.conf
Vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<VirtualHost *:80>
#for Tomcat 8 openGrok Android Source
ProxyPass /Android_4.2.2/ ajp://127.0.0.1:8009/Android_4.2.2/
ProxyPassReverse /AndroidXRef_4.2.2/ ajp://127.0.0.1:8009/AndroidXRef_4.2.2/
ProxyPass /Android_7.0.0_r21/ ajp://127.0.0.1:8009/Android_7.0.0_r21/
ProxyPassReverse /Android_7.0.0_r21/ ajp://127.0.0.1:8009/Android_7.0.0_r21/
ProxyPass /Android_10.0.0_r40/ ajp://127.0.0.1:8009/Android_10.0.0_r40/
ProxyPassReverse /Android_10.0.0_r40/ ajp://127.0.0.1:8009/Android_10.0.0_r40/
#for Tomcat 8 OpenGrok Chromium
ProxyPass /Chromium/ ajp://127.0.0.1:8009/Chromium/
ProxyPassReverse /Chromium/ ajp://127.0.0.1:8009/Chromium/
</VirtualHost>
|
Tomcat8
的配置文件/var/lib/tomcat8/conf/server.xml
中增加如下配置<Context path=”/Android_4.2.2″ docBase=”Android_4.2.2/”/>,解决跳转404问题。ProxyPass
后面必须携带“/”,否则就会出现404问题。
/var/lib/tomcat8/conf/server.xml
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<Host name=“localhost” appBase=“webapps”
unpackWARs=“true” autoDeploy=“true”>
<Context path=“/Android_4.2.2” docBase=“Android_4.2.2/”/>
<Context path=“/Android_7.0.0.r21” docBase=“Android_7.0.0_r21/”/>
<Context path=“/Android_10.0.0_r40” docBase=“Android_10.0.0_r40/”/>
<Context path=“/Chromium” docBase=“Chromium/”/>
<!– SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html –>
<!–
<Valve className=”org.apache.catalina.authenticator.SingleSignOn” />
–>
<!– Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern=”common” –>
<Valve className=“org.apache.catalina.valves.AccessLogValve” directory=“logs”
prefix=“localhost_access_log.” suffix=“.txt”
pattern=“%h %l %u %t "%r" %s %b” />
</Host>
|
7.配置OpenGrok
对源代码进行解析
设置要建立索引的源代码目录的位置,以存储在”/data/OpenGrok/Android_4.2.2
“上的Android
代码为例子:
1
2
3
|
$ export OPENGROK_INSTANCE_BASE=/data/OpenGrok/Android_4.2.2
$ export OPENGROK_WEBAPP_CONTEXT=Android_4.2.2
|
注意:
由于我们使用了Apache2的反向代理才需要设置 OPENGROK_WEBAPP_CONTEXT
,如果没有设置反向代理,请不要设置 OPENGROK_WEBAPP_CONTEXT
内容就是在 Apache2
中设置的 ProxyPassReverse
指定的参数。
在使用反向代理的时候如果不设置OPENGROK_WEBAPP_CONTEXT
会导致在点击具体的变量定义的时候,出现404.
不使用反向代理的时候请只设置OPENGROK_INSTANCE_BASE
创建源代码索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
$ cd /data/OpenGrok/Android_4.2.2
#删除源代码下面可能存在的”.git”,”.svn”隐藏目录
$ find . –name .svn –print0 | xargs –0 rm –r –f
$ find . –name .git –print0 | xargs –0 rm –r –f
# 删除无法进行索引的文件
$ find . –name *.apk –print0 | xargs –0 rm –r –f
$ find . –name *.zip –print0 | xargs –0 rm –r –f
$ find . –name *.jar –print0 | xargs –0 rm –r –f
# 编译工具是没有必要的目录
$ rm –rf prebuilts
$ export IDX_ROOT=/data/OpenGrok/Android_4.2.2/
$ export IDX_DATA=${IDX_ROOT}data/
$ export IDX_CONF=${IDX_ROOT}etc/configuration.xml
# 清理以前生成的索引数据
# 索引数据目录
$ cd ${IDX_ROOT}
$ rm –rf data
# 日志目录
$ rm –rf log
# 配置文件目录
$ rm –rf etc
$ rm –rf logging.properties
$ mkdir etc
# 限制索引内存占用,避免建立索引过程中引发OOM,
# 如果依旧出现OOM,则在参数中指定 “-T 1” 限制只能使用一个线程,不允许并发,减少内存开销
# 其实由于磁盘IO是整个索引的性能瓶颈,因此多线程并不能缩短太多的时间,反而占用了太多的内存
# 因此限制只能使用一个线程,在大多数情况下,是没问题的
# 同时使用 “-m 256” 参数增加 Lucene 4.x 使用的缓存的大小,避免出现问题
# Android 10的源代码至少需要2GB内存才能成功索引
$ export JAVA_OPTS=“-Xmx2048m”
$ opengrok–indexer –J=–Xmx2g –a /opt/opengrok/lib/opengrok.jar
|
执行时间在40分钟左右,执行完成 。(如果通过SSH远程登录,可能会出现中途连接断开的情况,原因为某项操作比较耗时,导致长时间没有数据通信,网络超时断开。 参考 Linux SSH保持连接(解决Broken pipe))生成的索引文件在源代码的”data
“目录下面,重建索引的时候需要执行如下操作,才能再次建立索引
1
2
3
4
5
6
7
8
9
10
|
# 索引数据目录
$ rm –rf data
# 日志目录
$ rm –rf log
# 配置文件目录
$ rm –rf etc
$ rm –rf logging.properties
|
注意,请务必删除源代码中的”prebuilts”目录,这个目录下面存储的是一系列的编译工具,在浏览代码的时候,完全用不上,但是占据的磁盘空间确是巨大的。
注意,如果服务器上面的内存比较有限,请使用如下命令进行内存限制,否则建立索引的时候,会触发内存不足的情况:
1
2
3
4
|
# 早期版本使用如下参数限制内存
$ export JAVA_OPTS=“-Xmx1024m”
# 最新版本OpenGrok-1.3.11/1.3.16使用-J=-Xmx2g 进行内存限制,Android 10的源代码至少需要2GB内存才能成功索引
|
修改OpenGrok
配置文件
1
|
$ sudo vim /var/lib/tomcat8/webapps/Android_4.2.2/WEB–INF/web.xml
|
修改其中的
/var/lib/tomcat8/webapps/source/WEB-INF/web.xml
XHTML
1
2
3
4
5
|
<context-param>
<param-name>CONFIGURATION</param-name>
<param-value>/var/opengrok/etc/configuration.xml</param-value>
<description>Full path to the configuration file where OpenGrok can read it’s configuration</description>
</context-param>
|
为具体的工程目录”/data/OpenGrok/Android_4.2.2
“,修改后的配置如下:
/var/lib/tomcat8/webapps/source/WEB-INF/web.xml
XHTML
1
2
3
4
5
|
<context-param>
<param-name>CONFIGURATION</param-name>
<param-value>/data/OpenGrok/Android_4.2.2/etc/configuration.xml</param-value>
<description>Full path to the configuration file where OpenGrok can read it’s configuration</description>
</context-param>
|
刷新浏览器,可以看到Android_4.2.2
的源码可以搜索出来了。
参考链接
- Android系统源码极速搜索引擎(OpenGrok)
- Linux下Opengrok安装部署与使用
- 在Ubuntu 12.04.2 LTS上安装OpenGrok浏览Android源码
- 在Ubuntu 12.04 LTS上安装OpenGrok浏览Android源码
- Opengrok的安装及配置
- 解决“ImportError: ‘module’ object has no attribute ‘check_specifier’”
- 在阿里云的Ubuntu 14.04系统上解决Tomcat 7由于OOM(Out Of Memory)而被系统杀掉的问题
- 在Ubuntu 14.04 系统中的Apache Tomcat上部署Apache Archiva 2.2.1
- indexer of AOSP fails with OutOfMemoryError and other exceptions #2647
- Tuning for large code bases
- OutOfMemoryError when indexing AOSP #2074
发布者
默默
码农 查看默默的所有文章
发布于 2019 年 6 月 5 日作者 默默分类 OpenGrok、Tomcat、Ubuntu 1,068 浏览
大部分步骤参考上述即可,需要注意的地方:
1. 不用特别安装甲骨文的java ,ubuntu18.04 自带的open java即可。
2. 在上文如下这句话的地方会异常,
“访问”http://localhost:8080/source/“确认OpenGrok是否已经安装成功,如果安装成功,出现下面的界面:”
异常现象:
“Unable to determine source root path. Missing configuration”
“Setting up OPENGROK_WEBAPP_CONTEXT doesn’t change the root directory”
参考下文处理:
ref: (21条消息) ubuntu16.04搭建openGrok_wd229047557的博客-CSDN博客
A. 配置CONFIGURATION:
在/var/lib/tomcat8/webapps/source/WEB-INF/web.xml中修改configuration.xml的路径,配置 configuration.xml 的路径为 opengrok/etc 配置目录
1
$ gedit /var/lib/tomcat8/webapps/source/WEB-INF/web.xml
2
<context-param>
3
<description>Full path to the configuration file where OpenGrok can read its configuration</description>
4
<param-name>CONFIGURATION</param-name>
5
<param-value>~/software/opengrok/opengrok-1.2.23/etc/configuration.xml</param-value> //自己创建的etc路径
6
</context-param>
B. 重启Tomcat,
//控制服务
sudo /etc/init.d/tomcat8 start
sudo /etc/init.d/tomcat8 stop
sudo /etc/init.d/tomcat8 restart
sudo service tomcat8 restart
在浏览器中输入 http://IP地址:8080/source,已经可以看到Opengrok的雏形,不过会有一个错误,是因为还未建立索引,所以configuration.xml还没生成,先不用关注:
http://10.100.xxx.xxx:8080/source
C.创建索引
//使用此命令来创建索引,具体文件键附件openGrok.sh
1
java -Xmx8g -jar ~/software/opengrok/opengrok-1.2.23/lib/opengrok.jar \
2
-c /opt/software/universal-ctags/bin/ctags \
3
-s ~/software/src \
4
-d ~/software/opengrok/opengrok-1.2.23/data -H -P -S -G -v \
5
-W ~/software/opengrok/opengrok-1.2.23/etc/configuration.xml \
6
-U http://localhost:8080/source \
7
-m 256
#-Xmx8g:配置Java 最大堆内存为8g,防止内存溢出。
#-jar:指定opengrok.jar包。
#-c:指定universal-ctags的路径,configure配置的路径,此时使用which ctags得到的路径是/usr/bin/ctags,是会报错的
#-s:指定源码路径,就是上面的新建的src。
#-d:指定索引文件存放路径,就是上面新建的data。
#-W:指定configuration.xml的路径,就是上面新建的etc。
#-m:指定opengrok索引时的缓存大小,默认只有16M。
把如上命令写入openGrok.sh,使用./openGrok.sh运行就可以
代码块
我自己测试用的的配置
startopenGrok.sh
java -Xmx12g -jar /opt/opengrok/lib/opengrok.jar \
-c /usr/local/bin/ctags \
-s /opt/opengrok/src \
-d /opt/opengrok/data -H -P -S -G -v \
-W /opt/opengrok/etc/configuration.xml \
-U http://localhost:8080/source \
-m 8256212
参考这句话,是否用opengrok-deploy 比自己写startopenGrok.sh更优美一些,此文件路径/usr/local/bin/opengrok。
The only thing that is required is that the path in CONFIGURATION needs to match the path used by the indexer (with -W). If the indexer does not use the default path (/var/opengrok/etc/configuration.xml) it is necessary to modify it (e.g. using the -c option of the opengrok-deploy script).
opengrok-indexer生成索引方法
sudo opengrok-indexer -J=-Djava.util.logging.config.file=/var/opengrok/logging.properties -a /opt/opengrok/lib/opengrok.jar -- -s /index/src -d /opt/opengrok/database/data -H -P -S -G -W /opt/opengrok/etc/configuration.xml -U http://localhost:8080/source
3.常用路径
a. tomcat 配置文件路径
/var/lib/tomcat8/webapps/source
b. ctags安装路径
/usr/local/bin/ctags
c. opengrok 安装路径
/opt/opengrok /opt/opengrok–1.3.11
d. opengrok python3安装的脚本路径
/usr/local/bin/opengrok
ln -s /home/tao/codebase/mt6797 /opt/opengrok/src/mt6797
ln -s /home/tao/codebase/full_k6873v1_64_pre /opt/opengrok/src/full_k6873v1_64_pre
ln -s /home/tao/codebase/pd1930_full /opt/opengrok/src/pd1930_full
4.避免网址上的再输入source
我希望这样的链接
http://192.168.68.2:8080/
而不是这样的
http://192.168.68.2:8080/source
方法:
The webapp path is defined based on the name of the war file in the Tomcat webapps directory. If it is ROOT.war the webapp will be deployed to /. If t is foo.war the webapp will be deployed to /foo.
$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/ROOT.war
代码块
我自己最终的配置
startopenGrok.sh
java -Xmx10g -jar /opt/opengrok/lib/opengrok.jar \
-c /usr/local/bin/ctags \
-s /opt/opengrok/src \
-d /opt/opengrok/data -H -P -S -G -v \
-W /opt/opengrok/etc/configuration.xml \
-U http://localhost:8080/ \
-m 8256
5.反向代理配置
6. 如何更新索引数据
更新索引数据和生成索引的方法是一样的,命令如下:
sudo opengrok-indexer -J=-Djava.util.logging.config.file=/var/opengrok/logging.properties -a /opt/opengrok/lib/opengrok.jar -- -s /index/src -d /opt/opengrok/database/data -H -P -S -G -W /opt/opengrok/etc/configuration.xml -U http://localhost:8080/source
在更新完之后,最好重启一下tomcat:
7.在索引源码时出现”Couldn’t notify the webapp…”
错误原因 :tomcat 8尚未启动解决办法 : 按照3.6 重启tomcat service的命令重新启动tomcat 8.
8. 在执行索引源码的时候出现”Exception: Cannot find Java”的错误
错误原因 :root用户无法使用java命令解决办法 :1. 按照1.1 安装oracle java 8描述的方法重新安装oracle 8, 确保执行sudo java -v能够正确输出java版本信息;2. 如果执行sudo java -v能够正确输出java版本信息,还是报上述错误,则先切换到root用户,然后执行索引源码的命令。
9.关于硬件配置
用这样的配置,同时跑三个codebase会把16G内存跑满,我跑了三天三夜都没跑完,电脑基本卡死。
只好只跑一份codebase,占用情况如下。
基本上一份codebase 就是6.5G用满,建议一份codebase 预留8G内存跑。
也就是我这台电脑最多跑两份codebase。
同时跑两份codebase
10. 参数配置解释
强烈建议通过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++相关的文件建立索引,不仅建立速度更快,占用空间也更小。
更新代码块
我自己最终的配置
startopenGrok.sh
java -Xmx10g -jar /opt/opengrok/lib/opengrok.jar \
-c /usr/local/bin/ctags \
-s /opt/opengrok/src \
-d /opt/opengrok/data -H -P -S -G -v \
-I *.java -I *.c -I *.h -I *.cpp
-W /opt/opengrok/etc/configuration.xml \
-U http://localhost:8080/ \
-m 8256
11.绑定小端口异常
因为linux 安全的原因,默认仅仅支持绑定>1023 的端口。
解释参考如下链接
ref: https://github.com/fatedier/frp/issues/1493
暂无评论内容