17
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenGrokによるソースコード検索環境の構築

Last updated at Posted at 2016-01-07

OpenGrokを用いてC/Python/JavaScriptのソースコード検索とクロスリファレンスを構築するまでの手順。

OpenGrokとは

{OpenGrok by OpenGrok

OpenGrok is a fast and usable source code search and cross reference engine.

公式GitHub repository: https://github.com/OpenGrok/OpenGrok

対応言語

公式ページより抜粋

本記事ではC/Python/JavaScriptソースコードの構築を試す。

[追記] Docker Image

カスタマイズ不要な場合は↑による構築が簡単。
以降はやや古いバージョンのOpenGrok手動インストール手順。

環境

  • debian 8.4/8.6 (jessie)

参考資料

前準備

OpenGrokバイナリ取得

現時点での最新stable(0.12.1.6)のバイナリをダウンロードする。

  • opengrok-0.12.1.6.tar.gz

OpenGrok 0.12.1.6

Requirements

README
2. Requirements
---------------

    * Latest Java (At least 1.8)
      http://www.oracle.com/technetwork/java/
    * A servlet container like Tomcat (8.x or later)
      supporting Servlet 2.5 and JSP 2.1
      http://tomcat.apache.org/
    * Exuberant Ctags or Universal Ctags
      http://ctags.sourceforge.net/
      http://github.io/uctags
    * Source Code Management installation
      depending on type of repositories indexed
    * If you want to build OpenGrok:
      - Ant (1.9.4 and later)
        http://ant.apache.org/
      - JFlex
        http://www.jflex.de/
      - Netbeans (optional, at least 8.0, will need Ant 1.9.4)
        http://netbeans.org/

Supported Deployment Engines

bin/OpenGrok
# Supported Deployment Engines:
#   - Tomcat 7
#   - Tomcat 6
#   - Glassfish

Supported Operating Systems

bin/OpenGrok
# Supported Operating Systems:
#   - Solaris 11  (SunOS 5.11)
#   - Solaris 12  (SunOS 5.12)
#   - Debian      (Linux)

Requirementsパッケージインストール

install-java
$ sudo aptitude install openjdk-7-jre
(略)
$ java -version
java version "1.7.0_111"
install-ctags
$ sudo aptitude install ctags
install-web-server
$ sudo aptitude install tomcat7 tomcat7-admin

tomcat準備

起動
$ sudo service tomcat7 start
$ sudo service tomcat7 status
● tomcat7.service - LSB: Start Tomcat.
   Loaded: loaded (/etc/init.d/tomcat7)
   Active: active (exited) since 火 2016-01-05 09:52:23 JST; 11s ago
  Process: 46899 ExecStart=/etc/init.d/tomcat7 start (code=exited, status=0/SUCCESS)

 1月 05 09:52:23 debian8 tomcat7[46899]: Starting Tomcat servlet engine: tomcat7.
$

server.xml を修正して使用ポート番号を2424(OpenGrokのデフォルトポート番号)に変更する。

server.xml
@@ -69,7 +69,7 @@
          APR (HTTP/AJP) Connector: /docs/apr.html
          Define a non-SSL HTTP/1.1 Connector on port 8080
     -->
-    <Connector port="8080" protocol="HTTP/1.1"
+    <Connector port="2424" protocol="HTTP/1.1"
                connectionTimeout="20000"
                URIEncoding="UTF-8"
                redirectPort="8443" />

tomcatを再起動する。

$ sudo service tomcat7 restart
$

インストール手順

OpenGrokバイナリからインストールする手順を示す。

OpenGrokインストール

untar
$ tar xvf opengrok-0.12.1.6.tar.gz
opengrok-0.12.1.6/doc/CHANGES.txt
opengrok-0.12.1.6/doc/LICENSE.txt
opengrok-0.12.1.6/doc/NOTICE.txt
opengrok-0.12.1.6/doc/README.txt
opengrok-0.12.1.6/doc/logging.properties
opengrok-0.12.1.6/doc/paths.tsv
opengrok-0.12.1.6/bin/OpenGrok
opengrok-0.12.1.6/doc/EXAMPLE.txt
opengrok-0.12.1.6/lib/lib/ant.jar
opengrok-0.12.1.6/lib/lib/bcel-5.2.jar
opengrok-0.12.1.6/lib/lib/jrcs.jar
opengrok-0.12.1.6/lib/lib/lucene-analyzers-common-4.7.1.jar
opengrok-0.12.1.6/lib/lib/lucene-core-4.7.1.jar
opengrok-0.12.1.6/lib/lib/lucene-queryparser-4.7.1.jar
opengrok-0.12.1.6/lib/lib/lucene-suggest-4.7.1.jar
opengrok-0.12.1.6/lib/lib/swing-layout-0.9.jar
opengrok-0.12.1.6/lib/opengrok.jar
opengrok-0.12.1.6/lib/source.war
opengrok-0.12.1.6/man/man1/opengrok.1
$
パスを通す
OPENGROK_PATH=<path to OpenGrok install dir>/opengrok-0.12.1.6
export PATH=$PATH:$OPENGROK_PATH/bin
deploy
$ sudo OpenGrok deploy
Loading the default instance configuration ...
Installing /opt/opengrok-0.12.1.6/bin/../lib/source.war to /var/lib/tomcat7/webapps ...

Start your application server (Tomcat),  if it is not already
running, or wait until it loads the just installed web  application.

OpenGrok should be available on <HOST>:<PORT>/source
  where HOST and PORT are configured in Tomcat.

ソースコード取り込み

まずはLinux 3.16.1のソースを入れてみる。
デフォルトでは/var/opengrok/srcがソース格納パスとなる。

source配置
$ sudo mkdir -p /var/opengrok/src

$ tar xvf linux-3.16.1.tar.gz
(中略)
$
$ sudo mv linux-3.16.1 /var/opengrok/src

OpenGrok indexを実行するとソースコードのインデックスが作成される。

opengrok-0.12.1/bin$ sudo ./OpenGrok index
Loading the default instance configuration ...
WARNING: OpenGrok generated data path /var/opengrok/data doesn't exist
  Attempting to create generated data directory ...
WARNING: OpenGrok generated etc path /var/opengrok/etc  doesn't exist
  Attempting to create generated etc directory ...
  Creating default /var/opengrok/logging.properties ...
opengrok-0.12.1/bin$

アクセス確認

http://<OpenGrok server IP address>:2424/source/ にWebブラウザからアクセスする。

top.png

検索画面が表示された。
インデックスが正しく作成されていないとIn Project(s)が表示されず、
検索するとエラーメッセージが表示される。

機能

OpenGrokの簡単な機能紹介。
言語を問わず共通した機能が使用できる。。

検索機能

全文検索/定義/シンボル等で検索可能。

TypeCにしてforkで検索してみると、ファイルを横断しての検索結果が表示される。
ディレクトリ毎にファイルがグループ分けされて、検索該当行が表示される。
個人的にはLXRより見やすい。

result.png

クロスリファレンス機能

変数や関数をクリックすると、その定義について検索する。

search_01.png

ナビゲート機能

ファイルを開いて、画面上部メニューからNavigateを選択すると、
ファイル内の変数と関数の定義一覧が表示される。
クリックすると該当箇所にジャンプできる。

navigate.png

search_02.png

ソースコード追加

新たなソースコードを追加するには、以下の手順を実施する。

  1. /var/opengrok/src以下にソースディレクトリを追加
  • ソース格納ディレクトリでgit cloneを実行でOK
  1. OpenGrok updateを実行する
  2. tomcatを再起動

例として、sysstatを追加してみる。

$ git clone https://github.com/sysstat/sysstat.git
...
/var/opengrok/src$ ls
linux-3.16.1  sysstat
opengrok-0.12.1/bin$ sudo ./OpenGrok update
opengrok-0.12.1/bin$ sudo service tomcat7 restart
opengrok-0.12.1/bin$ 

add.png

In Project(s)sysstatが追加された。

出力例

PythonとJavaScriptを追加した結果例。

Python

PythonソースもC言語ソースの追加と同じ方法で追加できる。
例として、psutilモジュールのソースを追加する。

ソース追加

/var/opengrok/src# git clone https://github.com/giampaolo/psutil.git
...
/var/opengrok/src# ls
linux-3.16.1  psutil
opengrok-0.12.1/bin$ sudo ./OpenGrok update
opengrok-0.12.1/bin$ sudo service tomcat7 restart
opengrok-0.12.1/bin$ 

画面出力

psutilが追加されている。TypePythonが選択できる。
検索結果はC言語での検索と同じ形式で出力される。

python_01.png

Navigateも機能し、ファイル内の変数と関数の定義が表示できる。

python_02.png

JavaScript

JavaScriptソースも同様に追加できる。
例として、jQueryを追加してみる。

ソース追加

/var/opengrok/src$ sudo git clone https://github.com/jquery/jquery.git
...
/var/opengrok/src$ ls
jquery  linux-3.16.1  psutil
$
opengrok-0.12.1/bin$ sudo ./OpenGrok update
opengrok-0.12.1/bin$ sudo service tomcat7 restart
opengrok-0.12.1/bin$ 

画面出力

TypeJavaScriptが選択できる。
検索結果はC言語での検索と同じ形式で出力される。

jquery_01.png

JavaScriptではNavigateはうまく働かないようだ。
表示が空白となっている。

jquery_02.png

Troubleshooting

インデックス作成(OpenGrok index)で失敗

OpenGrok indexを実行するとソースコードのインデックスが作成される。

インデックス作成失敗
opengrok-0.12.1/bin$ sudo ./OpenGrok index
Loading the default instance configuration ...
WARNING: OpenGrok generated data path /var/opengrok/data doesn't exist
  Attempting to create generated data directory ...
WARNING: OpenGrok generated etc path /var/opengrok/etc  doesn't exist
  Attempting to create generated etc directory ...
  Creating default /var/opengrok/logging.properties ...
10:16:54 SEVERE: Failed to send configuration to localhost:2424 (is web application server running with opengrok deployed?)
java.net.ConnectException: 接続を拒否されました
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at java.net.Socket.<init>(Socket.java:425)
        at java.net.Socket.<init>(Socket.java:241)
        at org.opensolaris.opengrok.configuration.RuntimeEnvironment.writeConfiguration(RuntimeEnvironment.java:928)
        at org.opensolaris.opengrok.index.Indexer.sendToConfigHost(Indexer.java:852)
        at org.opensolaris.opengrok.index.Indexer.main(Indexer.java:563)
opengrok-0.12.1/bin$

失敗した。verboseを有効にしてやってみると、
インデックスの作成までは成功して、Webサーバに通信するところで失敗している。

インデックス作成失敗_w/_verbose
$ sudo OPENGROK_VERBOSE=true  ./OpenGrok index
Loading the default instance configuration ...
Logging filehandler pattern: /var/opengrok/log/opengrok%g.%u.log
10:47:34 INFO: Scanning for repositories...
10:47:35 INFO: Done scanning for repositories (0s)
10:47:35 INFO: Writing configuration to /var/opengrok/etc/configuration.xml
10:47:35 INFO: Done...
10:47:35 INFO: Generating history cache for all repositories ...
10:47:35 INFO: Creating historycache for 0 repositories
10:47:35 INFO: Done historycache for all repositories (took 2 ms)
10:47:35 INFO: Done...
10:47:35 INFO: Starting indexing
10:47:37 INFO: Done indexing data of all repositories (took 1.984 seconds)
10:47:37 INFO: Send configuration to: localhost:2424
10:47:37 SEVERE: Failed to send configuration to localhost:2424 (is web application server running with opengrok deployed?)
java.net.ConnectException: 接続を拒否されました
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at java.net.Socket.<init>(Socket.java:425)
        at java.net.Socket.<init>(Socket.java:241)
        at org.opensolaris.opengrok.configuration.RuntimeEnvironment.writeConfiguration(RuntimeEnvironment.java:928)
        at org.opensolaris.opengrok.index.Indexer.sendToConfigHost(Indexer.java:852)
        at org.opensolaris.opengrok.index.Indexer.main(Indexer.java:563)
10:47:37 INFO: Configuration update routine done, check log output for errors.
10:47:37 INFO: Total time: 2.738 seconds
10:47:37 INFO: Final Memory: 2M/12M
Errorメッセージ抽出
SEVERE: Failed to send configuration to localhost:2424 (is web application server running with opengrok deployed?)

tomcatは動いているが、

$ netstat -an | grep 2424
$

ポート設定がデフォルトのままだった。
前述の手順で使用ポートを8080 -> 2424に変更し、./OpenGrok updateを実行すると成功した。

opengrok-0.12.1/bin$ sudo ./OpenGrok update
Loading the default instance configuration ...
toor@debian8:/home/tmp/opengrok-0.12.1/bin$

Once above command finishes without errors(e.g. SEVERE: Failed to send configuration to localhost:2424 ),

公式インストール手順にこういう記述がある。
ここではまる人が多いのかもしれない。

類似ツールとの比較

他の類似ツールではen/LXR Projectが有名。
LXR linux等、Linuxカーネルで使われることが多い。
LXR Cross Referencer を試してみた - harry’s memorandum

公式の類似ツールとの比較。
Comparison with Similar Tools · OpenGrok/OpenGrok Wiki

これによると、OpenGrokは以下のような特徴がある。

  • 優位
  • History Search
  • query syntax like AND, OR, field
  • Integration with Eclipse
  • 弱点
  • Integration with emacs/vim

Eclipse plugin

GrokClipseというEclipseとの連携プラグインが公開されている。
GrokClipse | Eclipse Plugins, Bundles and Products - Eclipse Marketplace

インストールを試みたが、失敗した。
ネット上でも情報がほとんどない。

17
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?