java maven

Maven依存ライブラリのライセンスサマリを出す

投稿日:2019年8月20日

Mavenで依存しているライブラリのライセンス累計を作成します。
下記のように「ライセンス名 ライブラリ個数」の行がライセンス種別数分作られるイメージ。

BSD 4
ASL2 43
MIT 5

開発中のクローズドなソースにGPLやAGPLなどのライセンスが含まれていないか分かるようにしておきます。

環境

  • Maven 3.5.2
  • Java 9
  • grep、sed、cut、awkコマンドが使えるターミナル

license-audio-maven-pluginインストール

Maven標準プラグインにはライブラリ名とライセンスを一覧表示する機能が有りません。ライセンス監査用のMavenプラグイン「license-audit-maven-plugin」を使用してライセンス一覧を表示させます。

このプラグイン単体でもライセンス違反を警告することが出来ますが、表示形式をカスタマイズしたいので今回はライセンス一覧を出す為に使用します。

githubからzipをダウンロードして解凍、解凍ディレクトリに入り、mvn clean installしてローカルmvnリポジトリにインストールすれば準備完了。

ライセンスサマリを表示

pom.xmlがある適当なMavenプロジェクトにターミナルで入り、reportゴールに-Dformat=summaryオプションを指定するとライセンスサマリが表示される。

$ mvn org.heneveld.maven:license-audit-maven-plugin:report -Dformat=summary
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- license-audit-maven-plugin:1.0-SNAPSHOT:report (default-cli) @ demo ---
[INFO] com.example:demo:0.0.1-SNAPSHOT: ASL2
[INFO] +-org.springframework.boot:spring-boot-starter-web:2.1.6.RELEASE (compile): ASL2
[INFO] | +-org.springframework.boot:spring-boot-starter:2.1.6.RELEASE (compile): ASL2
[INFO] | | +-org.springframework.boot:spring-boot:2.1.6.RELEASE (compile): ASL2
[INFO] | | | +-org.springframework:spring-core:5.1.8.RELEASE (compile, reported below): ASL2
[INFO] | | | +-org.springframework:spring-context:5.1.8.RELEASE (compile, reported below): ASL2
[INFO] | | | +-ch.qos.logback:logback-classic:1.2.3 (compile, optional, reported below): EPL1; LGPL
[INFO] | | | +-com.fasterxml.jackson.core:jackson-databind:2.9.9 (compile, optional, reported below): ASL2
[INFO] | | | +-org.apache.logging.log4j:log4j-api:2.11.2 (compile, optional, reported below): ASL2

    (snip)

[INFO] +-org.bouncycastle:bcprov-jdk15on:1.62 (compile, no dependencies): Bouncy Castle Licence
[INFO] org.slf4j:slf4j-api:1.7.26 (unknown, no dependencies): MIT
[INFO] com.fasterxml:classmate:1.4.0 (unknown, no dependencies): ASL2
[INFO] commons-codec:commons-codec:1.11 (unknown, no dependencies): ASL2
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.449 s
[INFO] Finished at: 2019-08-18T19:41:58+09:00
[INFO] Final Memory: 44M/565M
[INFO] ------------------------------------------------------------------------

不要部分削除、ライブラリ名:ライセンス名を抽出

awk、cut、grep、sedで必要部分のみ抽出。「EPL1 GPL」のように選択式になっているものは空白を削除して連結しています。

後に違反ライセンスとしてGPLを禁止ワードにした場合「GPLに完全一致しなければ選択式なのでOK」にする為です。

$ mvn org.heneveld.maven:license-audit-maven-plugin:report \
  -Dformat=summary \
  | awk '/Scanning/,/BUILD SUCCESS/' \
  | cut -d ":" -f 2,4 \
  | grep -v "[INFO]" \
  | grep -v "^\s*$" \ 
  | sed -e 's/;//g' -e 's/ //g'

// 実行結果
demo: ASL2
spring-boot-starter-web: ASL2
spring-boot-starter: ASL2
spring-boot: ASL2
spring-core: ASL2
spring-beans: ASL2

    (snip)

spring-beans: ASL2
slf4j-api: MIT

重複を削除

spring-beansのような複数ライブラリから芋づる式に依存されるものが複数表示されてしまうので、awkの連想配列を使用してライブラリ名でユニークにする。(sort | uniqでも可)

$ mvn org.heneveld.maven:license-audit-maven-plugin:report \
  -Dformat=summary \
  | awk '/Scanning/,/BUILD SUCCESS/' \
  | cut -d ":" -f 2,4 \
  | grep -v "[INFO]" \
  | grep -v "^\s*$" \ 
  | sed -e 's/;//g' -e 's/ //g'
  | awk '!a[$1]++'

// 実行結果
demo: ASL2
spring-boot-starter-web: ASL2
spring-boot-starter: ASL2
spring-boot: ASL2
spring-core: ASL2
spring-beans: ASL2

    (snip)

slf4j-api: MIT

集計

ライブラリ名:ライセンス名の行がユニークになったのでawkでライセンス名をキーにして集計。

$ mvn org.heneveld.maven:license-audit-maven-plugin:report \
  -Dformat=summary \
  | awk '/Scanning/,/BUILD SUCCESS/' \
  | cut -d ":" -f 2,4 \
  | grep -v "[INFO]" \
  | grep -v "^\s*$" \ 
  | sed -e 's/;//g' -e 's/ //g' \
  | awk '!a[$1]++' \
  | awk -F : '{ sum[$2]++; } END { for (key in sum) { print(key, " ", sum[key]) }}'

// 実行結果
BSD 1
EPL1LGPL 2
BouncyCastleLicence 1
<unknown> 1
<notloaded> 5
ASL2 43
EclipsePublicLicense-v2.0 1
CDDL+GPLv2withclasspathexception 1

まとめ

ライセンス毎のライブラリ数がサマリとして出せました。

同じライセンスでもEPLだったりEclipsePublicLicenseだったり揺れがあったりしてちょっと嫌な感じだったりしますが、CI実行してチャットなりに送信しておけば、万が一AGPLのような縛りのきついライセンスが含まれたりしても直ぐ気付けます。

-java, maven
-,

執筆者:

関連記事

H2 Databaseで生成したSHA256値をJavaで生成したSHA256値と比較してみる

ファイル、サーバ、メモリ、様々な動作形態がとれてプロトタイピングや、配布アプリの組み込みDBとして便利に使えるPure Javaデータベースの「H2」。 h2database.com  2 …

JavaでRSA暗号を使う際にCRYPTREC暗号リストに足元をすくわれる可能性を回避する

標準的な暗号しか使わないケースでもJavaでRSAを使う時はBouncyCastleを入れておいた方が無難、という話です。 “ECB”という文字列がプログラム中にあると監査に引 …

Spring&JSPの検証環境を作る

2019年現在、オワコン風潮の強いJSPですが使っているプロジェクトもまだまだあり、枯れた技術を好む官公庁系のプロジェクトでは根強いシェアを誇っています。実装検証をする為に環境を作る機会があったりする …

IPAmj明朝のttfファイルをJVMに読み込ませてSwingで表示(要Java11)

目次1 はじめに2 Java11でSwingがIVSを認識するようになった3 Java Swingソース4 動作確認4.1 Java 8(1.8.0_202)で実行4.2 Java 11(11.0.2 …

JavaコアAPI数の遷移をChart.jsでグラフ化してみる

chart.jsの試用を兼ねてJavaバージョンが上がるごとに標準搭載されているAPI数がどう変化しているか調べました。 目次1 調査結果2 グラフ化3 不要なAPIは外部化の傾向 調査結果 Orac …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。