jQAssistantで分析したクラス間の関係性をneo4j用のdumpファイルとして出力する

自分用備忘

## 環境
```bash
$ java -version
openjdk version "17.0.10" 2024-01-16
$ mvn -version
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
$ neo4j --version
5.26.3
```

## 要約
* mavenコマンドでクラス間の関係性を出力する
* その出力先をローカルで動いているneo4jのbolt(ドライバ的なもの)にする
* ローカルのneo4jにデータが取り込まれる
* 取り込まれたデータをneo4jのadminコマンドでdump化して出力する

## neo4jのセットアップ
### コマンドの方
1. neo4jを以下からダウンロード
https://neo4j.com/deployment-center/#:~:text=Launch%20Cloud%20Instance-,Graph%20Database%C2%A0,Self%2DManaged,-Enterprise%2Dgrade%20availability
1. 解凍して`/usr/local`に配置
1. パス通す
```bash
export NEO4J_HOME=/usr/local/neo4j-community-5.26.3
export PATH=$NEO4J_HOME/bin:$PATH
```

### Mavenの方
1. pomに以下足す
```xml
                <plugin>
                    <groupId>com.buschmais.jqassistant</groupId>
                    <artifactId>jqassistant-maven-plugin</artifactId>
                    <version>2.5.0</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>scan</goal>
                                <goal>analyze</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
```
[公式](https://github.com/jqassistant#maven)に書いてある通り。

## 出力、分析
mavenプロジェクトで以下を実行すると、target配下にneo4j用のデータが出力される
```bash
mvn jqassistant:scan
```

以下はjQAssistantのGitHubに添付の画像
scanによりグラフDB用構造のデータを出力し、
その後analyze(`mvn jqassitant:analyze`)によって分析を実施するというライフサイクル

![](https://raw.githubusercontent.com/jQAssistant/.github/main/profile/jqa_process.jpg)
https://github.com/jqassistant#the-jqassistant-lifecycle

そしてそれらの結果は、serverコマンドによってグラフィカルに表示できる
```bash
mvn jqassistant:server
```
こちらのコマンドを実行すると、内蔵されているneo4jのアプリケーションが起動し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541075/2e13b1da-7d5e-4d1e-ae9c-27d64dc28920.png)
scanやanalyzeの結果を確認することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541075/a7b0d48e-0922-41c5-9933-0d8b0eb3a9ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541075/b4345255-dc8e-4b5c-b7e3-9805d55870f9.png)

基本的には上記の機能を使うのみで十分

## 出力結果を他環境に移したい場合
今回、分析対象となるソースコードを受け渡すことなく、scanによって出力したグラフDB用構造のデータのみを受け渡したいというニーズが発生
`mvn jqassistant:export-database`というコマンドで出力可能というコメントも見られたが、今回利用しているバージョンでは当該機能の提供は確認できなかった

したがって、
1. jQAssistantに内蔵のものではないneo4jインスタンスにデータを一旦読み込ませる
1. そのneo4jインスタンスからコマンドによってdumpデータを出力する

という方法を採った

`jQAssistantに内蔵のものではないneo4jインスタンス`とは、セットアップの項で「コマンドのもの」と言っているものと同義
まずはそちらのインスタンスを立ち上げるために起動コマンドを実行
```bash
neo4j start
```
この時、jQAssistantに内蔵のneo4jが起動していると、portがalready in useで失敗するため
`mvn jqassistant:server`を実行している場合は停止させておく

neo4jは、webアプリケーションを動かすport(デフォルト:7474)と
boltというものを動かすport(デフォルト:7687)の二つを使用する

boltはとても大雑把に言うとneo4jにデータを注入するための入口のようなもの
なので、コマンドの方のneo4jのboltに対してjQAssistantの出力を向けてやることで、データの注入が行える

そのためのコマンドが以下
```bash
mvn jqassistant:scan -Djqassistant.store.uri=bolt://localhost:7688
```

この設定に関する公式の説明はこちら
デフォルトではtarget配下のファイルパスが設定されているため、何も指定しないと物理ファイルとして出力するということ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541075/1f892d49-a720-4b44-bea9-ed95eca2692a.png)

https://jqassistant.github.io/jqassistant/current/#cli:analyze:~:text=%2DDjqassistant.store.uri

以上によりjQAssistantに内蔵のものではないneo4jインスタンス、
つまりコマンドによって起動したneo4jインスタンスの方にデータが取り込まれたので
あとはパッケージに内蔵されたコマンドでdumpファイルを出力してやればOK

データを掴んでいると出力できないようなので、一度プロセスを終了し
```bash
neo4j stop
```
neo4jのadminコマンドでdumpを出力する(パスは任意)
```bash
neo4j-admin database dump --to-path=./dumps neo4j --verbose
```

あとは生成したdumpファイルをアップロードするなり別環境でインポートするなりすればOK

## 追記
`mvn clean`の直後などでコンパイル結果が生成されていない場合は正しく分析できない
一度`mvn compile`などを行ってから`mvn jqassistant:scan`するのが吉

## 参考リンク
jQAssistant GitHub
https://github.com/jqassistant

neo4jのパッケージ入手はこちらから
https://neo4j.com/deployment-center/