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
-,

執筆者:

関連記事

Jerseyで開発したRESTで任意リファラからのCORSアクセスを許可する

package jp.hoge.filter; import java.util.Properties; import javax.servlet.http.HttpServletRequest; i …

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 …

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

目次1 IPAmj明朝フォントとは2 日本における漢字のコンピュータ表示課題3 サロゲートペアが対応策だが4 IVS(ideographic variation sequence) とは5 そこでIP …

JUnitコードの自動生成も出来る古の神Eclipseプラグイン「CodeProAnalytix」は今でも使える

デスマーチPM「各社のPG進捗が遅れていてユニットテストを書く暇が全く無いんですよ、なにかいい手は有りませんかね・・・? 因みに本プロジェクトはカバレッジ100%で請け負っています!(キリッ)」 何故 …

Stripe + Javaでオーソリ(与信の確保)を実装する

Stripeでチャリンチャリン、サービスを開発するエンジニアにとっては夢がありますよね。 例え自分で個人的に売るものが無かったとしても、Web決済システムを構築できるノウハウを持っておけば、公的な仕事 …

 

shingo.nakanishi
 

東京在勤、職歴20年越え中年ITエンジニアです。まだ開発現場で頑張っています。

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

私と同じく、今後IT業界で生計を立てて行きたいと考えている方や、技術共有したいけどフリーランスで孤独、といった方と一緒に成長、知識共有して行けたら楽しいな、と思っています。