在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版

在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码

图片[1]-在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 8Apache 2.4的配置安装,只不过路径中的 Tomcat7 目录替换成 Tomcat8

2.安装 Tomcat 8

1
2
3
4
5
6
7
8
9
$ sudo aptget install tomcat8
 
# 一般卸载 tomcat7
$ sudo aptget remove purge tomcat7*
 
# 调整内存,默认的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 aptget purge ctags
 
$ sudo aptget install git
 
$ sudo aptget install autoconf
 
$ sudo aptget install pkgconfig
 
$ cd ~
 
$ git clone depth=1 https://github.com/universalctags/ctags.git
 
$ 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 aptget 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 opengrok1.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 opengrok1.3.11 /opt/opengrok
 
# sudo ln -s opengrok-1.3.16 /opt/opengrok
 
# 安装工具,必须是Python3 ,Python2 安装会失败
$ sudo aptget install python3pip
 
$ sudo pip3 install upgrade pip
 
# 如果报错 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 upgrade setuptools
 
$ sudo pip3 install /opt/opengrok/tools/opengroktools.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是否已经安装成功,如果安装成功,出现下面的界面:图片[2]-在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版-今天我都干啥了

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 &quot;%r&quot; %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”
 
$ opengrokindexer J=Xmx2g a /opt/opengrok/lib/opengrok.jar  m 256 s $IDX_ROOT d $IDX_DATA T 1 H P S G W $IDX_CONF

执行时间在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/WEBINF/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的源码可以搜索出来了。

参考链接

发布者

默默

码农

发布于 2019 年 6 月 5 日作者 默默分类 OpenGrokTomcatUbuntu 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

http://localhost: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/opengrok1.3.11

d. opengrok python3安装的脚本路径

/usr/local/bin/opengrok

图片[3]-在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版-今天我都干啥了

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.反向代理配置

OpenGrok反向代理配置, 测试ok的版本

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

图片[4]-在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版-今天我都干啥了

错误原因 :tomcat 8尚未启动解决办法 : 按照3.6 重启tomcat service的命令重新启动tomcat 8.

8. 在执行索引源码的时候出现”Exception: Cannot find Java”的错误

图片[5]-在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版-今天我都干啥了

错误原因 :root用户无法使用java命令解决办法 :1. 按照1.1 安装oracle java 8描述的方法重新安装oracle 8, 确保执行sudo java -v能够正确输出java版本信息;2. 如果执行sudo java -v能够正确输出java版本信息,还是报上述错误,则先切换到root用户,然后执行索引源码的命令。

9.关于硬件配置


图片[6]-在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版-今天我都干啥了

用这样的配置,同时跑三个codebase会把16G内存跑满,我跑了三天三夜都没跑完,电脑基本卡死。

只好只跑一份codebase,占用情况如下。

基本上一份codebase 就是6.5G用满,建议一份codebase 预留8G内存跑。

也就是我这台电脑最多跑两份codebase。

图片[7]-在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版-今天我都干啥了

同时跑两份codebase

图片[8]-在Ubuntu 18.04 LTS上安装OpenGrok-1.3.11/1.3.16浏览Android源码 – 折腾好久整理的个人可用版-今天我都干啥了

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

© 版权声明
THE END
在时间中留下我的脚印
分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情图片

    暂无评论内容