One IT Thing

IT業界を楽しむ為の学習系雑記

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だったり揺れがあったりしてちょっと嫌な感じだったりしますが、定期的に実行してメールなりチャットなりに送信しておけば、万が一AGPLのような縛りのきついライセンスが含まれたりしても直ぐ気付けます。

-java, maven
-,

執筆者:

関連記事

IVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(2)

前回の続きです。 One IT ThingIVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(1)https://one-it-thing.com/2098IP …

IVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(3)

前回の続きです。 One IT ThingIVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(2)https://one-it-thing.com/2111前回 …

ブラウザでRSA暗号化したデータをサーバで復号する(Angular + JSEncrypt、Spring MVC)【前編】

セキュリティ的にクリティカルなデータをクライアントブラウザで暗号化保存するようにしてみます。 通信経路はHTTPSで暗号化されていてもスマホに重要なデータが平文で残っていたら珠に傷です。 目次1 環境 …

IVS、サロゲートペアが混じった文字列をJavaのWebアプリでワードカウントする

(結論:java.text.BreakIteratorは「サロゲートペア文字 + IVS」の8バイト文字も1文字としてカウントしてくれる) 先日、IPAmj明朝フォントを使ってIVSを含んだUnico …

JavaとPerlでUDPソケット通信

目次1 はじめに2 対象読者3 実装3.1 UDPサーバ(Perl)3.2 UDPクライアント(Java)3.3 実行4 まとめ はじめに 本棚を整理していたらラクダ本が出てきました。うわー懐かしい、 …


shingo nakanishi。東京で消耗中の職歴20年越え中年ITエンジニアです。「生涯現役プログラマを楽しむ」ことができる働き方探しをライフワークにしています。

19歳(1996年)から書き始めた個人日記が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。