一つのコードに複数のライセンスを与える理由
著作権者は、同じコードを複数の条件で同時に許諾できます。受け取る人はその中から一つを選んで、その条件を守ればよいのです。こうする目的は大きく2つあります。
- 互換性を広げる — 異なるエコシステムのどれともうまく合うようにするため。
- ビジネスモデル — オープンソースとして公開しつつ、別途商用ライセンスを販売するため。
類型1: 寛容型2つを併用 — MIT OR Apache-2.0
Rust 言語とほとんどの Rust クレートが採用している方式です。利用者は MIT と Apache-2.0 のうち都合のよいほうを選びます。
- Apache-2.0 を選べば、明示的な特許許諾を受けられます。
- MIT を選べば、GPL-2.0-only のプロジェクトにも入れられます(Apache-2.0 は GPL-2.0 と互換性がないという FSF の立場のため)。
両方の利点を得られるので、ライブラリの作者に人気があります。リポジトリには LICENSE-MIT と LICENSE-APACHE の2つのファイルを置くのが慣例です。
類型2: コピーレフト+商用 — 「GPL か、お金を払うか」
コードを GPL・AGPL で公開し、ソース公開義務を負いたくない企業には別契約で商用ライセンスを販売します。MySQL(GPL+Oracle の商用ライセンス)、Qt(LGPL-3.0/GPL+商用)が代表的な例です。
このモデルは、著作権者がすべてのコードの権利を持っていて初めて機能します。外部の貢献者が GPL でのみ貢献したコードは、著作権者が商用ライセンスで販売する権利を持たないからです。
CLA と DCO
- CLA(コントリビューターライセンス契約): 貢献者がプロジェクトの運営主体に、貢献部分を幅広く(再ライセンスを含めて)使用する権利を与えるか、著作権を譲渡する契約です。商用のデュアルライセンスを行うには事実上必要です。Apache 財団の ICLA のように、再ライセンスの権限だけを与え、著作権は貢献者に残す形もあります。
- DCO(Developer Certificate of Origin): 貢献者が「このコードをこのプロジェクトのライセンスで提出する権利がある」ことをコミットごとに確認する方式です(
git commit -sでSigned-off-by:の行を追加)。Linux カーネルが採用しています。DCO は再ライセンスの権限を与えないので、商用のデュアルライセンスには不十分です。
SPDX 式での書き方
複数のライセンスの関係は SPDX ライセンス式で書きます。
| 式 | 意味 | 例 |
|---|---|---|
A OR B | 2つのうち1つを選んで従う(選択型デュアル) | MIT OR Apache-2.0 |
A AND B | 両方に従う必要がある(異なる部分が混在する場合) | MIT AND BSD-3-Clause |
A WITH 例外 | ライセンスに例外条項を付ける | GPL-2.0-only WITH Linux-syscall-note |
| 括弧 | 結合の順序を指定 | (MIT OR Apache-2.0) AND Unicode-3.0 |
OR と AND を取り違えると意味が正反対になります。利用者が選べるなら OR、すべて守る必要があるなら AND です。
注意点
- すでに与えた権利は維持される: 後から商用ライセンスだけを残しても、以前にオープンソースとして配布したバージョンの許諾は通常そのまま有効です。
- 「オープンコア」とは違う: 中核はオープンソース、追加機能は非公開の商用として売るモデルはデュアルライセンスではありません。同じコードに2つのライセンスを与えるのがデュアルライセンスです。
- ソース公開型ライセンスと混同しない: BUSL・SSPL のように、ソースは見えるものの OSI の基準ではオープンソースではないライセンスに移行する事例が増えています。これはデュアルライセンスとは異なる戦略です。
- 表示ファイルを正確に: 選択型であれば、各ライセンスの全文をすべて提供し、README に「どちらかを選択」であることを明記します。
適用例
Rust スタイルのデュアルライセンスを適用するには、生成ツールで MIT と Apache-2.0 のファイルをそれぞれ入手して LICENSE-MIT、LICENSE-APACHE として保存し、メタデータに license = "MIT OR Apache-2.0" と書きます。各ファイルのヘッダーには SPDX-License-Identifier: MIT OR Apache-2.0 を書きます。
この記事は一般的な情報であり、法的助言ではありません。重要な決定は専門家にご相談ください。
参考資料
- SPDX Specification, License Expressions — https://spdx.github.io/spdx-spec/v2.3/SPDX-license-expressions/
- Rust API Guidelines, Licensing — https://rust-lang.github.io/api-guidelines/necessities.html
- Developer Certificate of Origin — https://developercertificate.org/
- Apache ICLA — https://www.apache.org/licenses/contributor-agreements.html