これは、なにをしたくて書いたもの?
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
(プラグイン内に含まれている)以下の情報が元になっているようです。リポジトリ、と呼ぶようです。
追加のリポジトリを使用する場合は、「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
こんな感じです。
依存ライブラリのライセンスをダウンロードする「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で見る
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.8.2</version> </plugin>
「site」を実行した際に含まれるレポート内で、依存関係を見ることができます。
$ mvn site
ただ、pom.xmlに書かれている内容を関連さえあれば全部拾ってきてしまうので、量が膨大になります。
Mavenプロジェクトのレポートとしては、こちらを。