CLOVER🍀

That was when it all began.

Licenses Maven Pluginで、依存ライブラリのライセンスを確認する

これは、なにをしたくて書いたもの?

Mavenプロジェクトで、依存ライブラリのライセンスを調べるにはどうしたらいいのかな?ということで調べてみたら、
Licenses Maven Pluginというものが使えそうだったので、試してみることにしました。

Licenses Maven Plugin

Mavenプロジェクトと、その依存関係のライセンスを管理するプラグインらしいです。

This plugin manages the license of a maven project and its dependencies (update file headers, download dependencies licenses, check thirdparty licenses, ...)

License Maven Plugin – Introduction

ライセンスの情報を出力したり、ダウンロードしてきたりできる模様。

プロジェクトのソースファイルのヘッダーを更新したり、自身のプロジェクトのライセンスの管理もできるようです。

ちょっと試してみましょう。

環境とサンプルプロジェクト

なにかしら、Mavenプロジェクトがないと始まらないので、サンプルを用意します。

まずは、環境。

$ java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing)


$ mvn -version
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-28T00:06:16+09:00)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.4, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-62-generic", arch: "amd64", family: "unix"

Mavenプロジェクトは、簡単に用意できて、依存関係の多いSpring Boot(でWeb MVC)を使うことにしました。
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.littlewings</groupId>
    <artifactId>spring-boot-collect-licenses</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.8.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

とりあえず勢いでソースコードも用意しましたが、あんまり意味はありません。
src/main/java/org/littlewings/spring/hello/App.java

package org.littlewings.spring.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class App {
    public static void main(String... args) {
        SpringApplication.run(App.class, args);
    }

    @GetMapping("/hello")
    public String hello() {
        return "Hello World!!";
    }
}

利用可能なライセンスを表示する「license:license-list」

「license:license-list」で、利用可能なライセンスを表示することができます。

License Maven Plugin – license:license-list

実行。

$ mvn license:license-list

結果。

[INFO] --- license-maven-plugin:2.0.0:license-list (default-cli) @ spring-boot-collect-licenses ---
[INFO] Adding a license repository jar:file:$HOME/.m2/repository/org/codehaus/mojo/license-maven-plugin/2.0.0/license-maven-plugin-2.0.0.jar!/META-INF/licenses
[INFO] register GNU Free Documentation License (FDL) version 1.3
[INFO] register GNU General Lesser Public License (LGPL) version 3.0
[INFO] register GNU Affero General Public License (AGPL) version 3.0
[INFO] register GNU General Public License (GPL) version 3.0
[INFO] register GNU General Public License (GPL) version 2.0
[INFO] register GNU General Public License (GPL) version 1.0
[INFO] register Apache License version 2.0
[INFO] register Eclipse Public License - v 2.0 with Secondary License
[INFO] register Eclipse Public License - v 2.0
[INFO] register Eclipse Public License - v 1.0
[INFO] register Eclipse Public + Distribution License - v 1.0
[INFO] register COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
[INFO] register GNU General Lesser Public License (LGPL) version 2.1
[INFO] register MIT-License
[INFO] register BSD 2-Clause License
[INFO] register BSD 3-Clause License
[INFO] register European Union Public License v1.1
[INFO] Available licenses :

 * agpl_v3     : GNU Affero General Public License (AGPL) version 3.0
 * apache_v2   : Apache License version 2.0
 * bsd_2       : BSD 2-Clause License
 * bsd_3       : BSD 3-Clause License
 * cddl_v1     : COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
 * epl_only_v1 : Eclipse Public License - v 1.0
 * epl_only_v2 : Eclipse Public License - v 2.0
 * epl_v1      : Eclipse Public + Distribution License - v 1.0
 * epl_v2      : Eclipse Public License - v 2.0 with Secondary License
 * eupl_v1_1   : European Union Public License v1.1
 * fdl_v1_3    : GNU Free Documentation License (FDL) version 1.3
 * gpl_v1      : GNU General Public License (GPL) version 1.0
 * gpl_v2      : GNU General Public License (GPL) version 2.0
 * gpl_v3      : GNU General Public License (GPL) version 3.0
 * lgpl_v2_1   : GNU General Lesser Public License (LGPL) version 2.1
 * lgpl_v3     : GNU General Lesser Public License (LGPL) version 3.0
 * mit         : MIT-License

ここで言う「利用可能なライセンス(all available licenses)」というのは、実行ログとソースコードを見るとわかりますが

[INFO] Adding a license repository jar:file:$HOME/.m2/repository/org/codehaus/mojo/license-maven-plugin/2.0.0/license-maven-plugin-2.0.0.jar!/META-INF/licenses

(プラグイン内に含まれている)以下の情報が元になっているようです。リポジトリ、と呼ぶようです。

https://github.com/mojohaus/license-maven-plugin/tree/license-maven-plugin-2.0.0/src/main/resources/META-INF/licenses

追加のリポジトリを使用する場合は、「extraResolver」を指定します。

サードパーティ製のライセンスのレポートを作成する「license:third-party-report」

「license:third-party-report」を使用すると、サードパーティ製のライセンスに関するレポートを作成してくれます。

License Maven Plugin – license:third-party-report

実行。

$ mvn license:third-party-report

「test」などのスコープを外すには、「license.excludedScopes」システムプロパティで、除外するスコープを指定します。

$ mvn license:third-party-report -Dlicense.excludedScopes=test

結果は、以下に出力されます。

target/site/third-party-report.html

こんな感じです。

f:id:Kazuhira:20190911161924p:plain

依存ライブラリのライセンスをダウンロードする「license:download-licenses」

依存ライブラリのライセンスをダウンロードにするには、「license:download-licenses」を使用します。

License Maven Plugin – license:download-licenses

ダウンロードされたライセンスは、成果物に含めることができるようです。

ちなみに、マルチモジュール構成のMavenプロジェクトの場合は、「license:aggregate-download-licenses」を使うようですよ。

License Maven Plugin – license:aggregate-download-licenses

実行。

$ mvn license:download-licenses


## 「test」除外
$ mvn license:download-licenses -Dlicense.excludedScopes=test

結果は、こんな感じに置かれます。

$ find target/generated-resources/licenses* -type f
target/generated-resources/licenses/gnu lesser general public license - lgpl-2.1.html
target/generated-resources/licenses/mit license - mit-license.html
target/generated-resources/licenses/apache license, version 2.0 - license-2.0.txt
target/generated-resources/licenses/the apache software license, version 2.0 - license-2.0.txt
target/generated-resources/licenses/cddl + gplv2 with classpath exception - license.html
target/generated-resources/licenses/eclipse public license - v 1.0 - epl-v10.html
target/generated-resources/licenses.xml

「licenses.xml」には、こんな感じに各ライブラリのライセンス情報と、ライセンスのURLが含まれます。

$ head -n 50 target/generated-resources/licenses.xml 
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<licenseSummary>
  <dependencies>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
      <licenses>
        <license>
          <name>Eclipse Public License - v 1.0</name>
          <url>http://www.eclipse.org/legal/epl-v10.html</url>
          <file>eclipse public license - v 1.0 - epl-v10.html</file>
        </license>
        <license>
          <name>GNU Lesser General Public License</name>
          <url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html</url>
          <file>gnu lesser general public license - lgpl-2.1.html</file>
        </license>
      </licenses>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.3</version>
      <licenses>
        <license>
          <name>Eclipse Public License - v 1.0</name>
          <url>http://www.eclipse.org/legal/epl-v10.html</url>
          <file>eclipse public license - v 1.0 - epl-v10.html</file>
        </license>
        <license>
          <name>GNU Lesser General Public License</name>
          <url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html</url>
          <file>gnu lesser general public license - lgpl-2.1.html</file>
        </license>
      </licenses>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
      <licenses>
        <license>
          <name>The Apache Software License, Version 2.0</name>
          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
          <distribution>repo</distribution>
          <file>the apache software license, version 2.0 - license-2.0.txt</file>
        </license>
      </licenses>
    </dependency>

どのライブラリがどのライセンスっていうのを個別にリストアップしたかったら、このXMLファイルを解析するのがよいでしょうかね?

各ライセンスのファイルには、こんな感じにライセンスの内容が書かれています。

$ head -n 20 target/generated-resources/licenses/apache\ license\,\ version\ 2.0\ -\ license-2.0.txt 

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or

依存ライブラリのライセンスのリストを生成する「license:add-third-party」

依存ライブラリのライセンスのリストを生成するには、「license:add-third-party」を使用します。

License Maven Plugin – license:add-third-party

マルチプロジェクト構成のMavenプロジェクトの場合は、「license:aggregate-add-third-party」を実行します。

License Maven Plugin – license:aggregate-add-third-party

実行。

$ mvn license:add-third-party


## 「test」除外
$ mvn license:add-third-party -Dlicense.excludedScopes=test

結果は、こちらに。

target/generated-sources/license/THIRD-PARTY.txt

中身は、こんな感じのファイルになります。

Lists of 36 third-party dependencies.
     (Eclipse Public License - v 1.0) (GNU Lesser General Public License) Logback Classic Module (ch.qos.logback:logback-classic:1.2.3 - http://logback.qos.ch/logback-classic)
     (Eclipse Public License - v 1.0) (GNU Lesser General Public License) Logback Core Module (ch.qos.logback:logback-core:1.2.3 - http://logback.qos.ch/logback-core)
     (The Apache Software License, Version 2.0) ClassMate (com.fasterxml:classmate:1.4.0 - http://github.com/FasterXML/java-classmate)
     (The Apache Software License, Version 2.0) Jackson-annotations (com.fasterxml.jackson.core:jackson-annotations:2.9.0 - http://github.com/FasterXML/jackson)
     (The Apache Software License, Version 2.0) Jackson-core (com.fasterxml.jackson.core:jackson-core:2.9.9 - https://github.com/FasterXML/jackson-core)
     (The Apache Software License, Version 2.0) jackson-databind (com.fasterxml.jackson.core:jackson-databind:2.9.9.3 - http://github.com/FasterXML/jackson)
     (The Apache Software License, Version 2.0) Jackson datatype: jdk8 (com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.9 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
     (The Apache Software License, Version 2.0) Jackson datatype: JSR310 (com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.9 - https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
     (The Apache Software License, Version 2.0) Jackson-module-parameter-names (com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.9 - https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
     (CDDL + GPLv2 with classpath exception) javax.annotation API (javax.annotation:javax.annotation-api:1.3.2 - http://jcp.org/en/jsr/detail?id=250)
     (Apache License 2.0) Bean Validation API (javax.validation:validation-api:2.0.1.Final - http://beanvalidation.org)
     (Apache License, Version 2.0) Apache Log4j API (org.apache.logging.log4j:log4j-api:2.11.2 - https://logging.apache.org/log4j/2.x/log4j-api/)
     (Apache License, Version 2.0) Apache Log4j to SLF4J Adapter (org.apache.logging.log4j:log4j-to-slf4j:2.11.2 - https://logging.apache.org/log4j/2.x/log4j-to-slf4j/)
     (Apache License, Version 2.0) tomcat-embed-core (org.apache.tomcat.embed:tomcat-embed-core:9.0.24 - https://tomcat.apache.org/)
     (Apache License, Version 2.0) tomcat-embed-el (org.apache.tomcat.embed:tomcat-embed-el:9.0.24 - https://tomcat.apache.org/)
     (Apache License, Version 2.0) tomcat-embed-websocket (org.apache.tomcat.embed:tomcat-embed-websocket:9.0.24 - https://tomcat.apache.org/)
     (Apache License 2.0) Hibernate Validator Engine (org.hibernate.validator:hibernate-validator:6.0.17.Final - http://hibernate.org/validator/hibernate-validator)
     (Apache License, version 2.0) JBoss Logging 3 (org.jboss.logging:jboss-logging:3.3.3.Final - http://www.jboss.org)
     (MIT License) JUL to SLF4J bridge (org.slf4j:jul-to-slf4j:1.7.28 - http://www.slf4j.org)
     (MIT License) SLF4J API Module (org.slf4j:slf4j-api:1.7.28 - http://www.slf4j.org)
     (Apache License, Version 2.0) Spring AOP (org.springframework:spring-aop:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Beans (org.springframework:spring-beans:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Context (org.springframework:spring-context:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Core (org.springframework:spring-core:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Expression Language (SpEL) (org.springframework:spring-expression:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Commons Logging Bridge (org.springframework:spring-jcl:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Web (org.springframework:spring-web:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Web MVC (org.springframework:spring-webmvc:5.1.9.RELEASE - https://github.com/spring-projects/spring-framework)
     (Apache License, Version 2.0) Spring Boot (org.springframework.boot:spring-boot:2.1.8.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot)
     (Apache License, Version 2.0) Spring Boot AutoConfigure (org.springframework.boot:spring-boot-autoconfigure:2.1.8.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-autoconfigure)
     (Apache License, Version 2.0) Spring Boot Starter (org.springframework.boot:spring-boot-starter:2.1.8.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter)
     (Apache License, Version 2.0) Spring Boot Json Starter (org.springframework.boot:spring-boot-starter-json:2.1.8.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-json)
     (Apache License, Version 2.0) Spring Boot Logging Starter (org.springframework.boot:spring-boot-starter-logging:2.1.8.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-logging)
     (Apache License, Version 2.0) Spring Boot Tomcat Starter (org.springframework.boot:spring-boot-starter-tomcat:2.1.8.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-tomcat)
     (Apache License, Version 2.0) Spring Boot Web Starter (org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE - https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-web)
     (Apache License, Version 2.0) SnakeYAML (org.yaml:snakeyaml:1.23 - http://www.snakeyaml.org)

今回確認したかったLicenses Maven Pluginのゴールはこれくらいなので、ここまで。

オマケ:Maven Site Pluginで見る

Maven Site Pluginをプラグインに追加して

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.8.2</version>
            </plugin>

「site」を実行した際に含まれるレポート内で、依存関係を見ることができます。

$ mvn site

ただ、pom.xmlに書かれている内容を関連さえあれば全部拾ってきてしまうので、量が膨大になります。

f:id:Kazuhira:20190911160719p:plain

Mavenプロジェクトのレポートとしては、こちらを。