uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

JavaとGPL

Javaで書かれたプログラムでGPLなものはあまり聞きません。
なんででしょうかね〜。と思って考察してみました。

GPLのFAQを見ると、

http://www.gnu.org/licenses/gpl-faq.ja.html#GPLPluginsInNF

プログラムがプラグインと動的にリンクされ、お互いにファンクションコール を使ってデータ構造を共有している場合、それらは単一のプログラムを形成し ていると見なされますので、プラグインはメインプログラムの拡張部分として 扱われなければなりません。このことは、GPLで保護されたプラグインをメイ ンプログラムとリンクするのはGPL違反となることを意味しています。

とあります。JVM上で実行するプログラムも、一連のJava APIクラス群と相互に呼び出し合ったりデータ構造を共有したりしているので、単一のプログラムを形成していると見なされるでしょう。仮にプログラムが、一切Java APIを呼びださない、空のmain()だけであっても、その1つ前のFAQをみると

http://www.gnu.org/licenses/gpl-faq.ja.html#GPLAndPlugins

プログラムがプラグインと動的にリンクされているが、それらの間のコミュニ ケーションはいくつかのオプションとともにプラグインの「main」関数を呼び 出して返値を待つだけという場合は、境界線上で微妙なケースとなります。

とありますので、main()を呼ぶだけですら、「境界線上」であり、すなわち白ではない、とFSFは主張しているようです。

もともとGPLのOpenJDKなら問題ないでしょうが、Sun JDKIBMその他GPLではないJava環境の場合、GPLプログラムを走らせた時点で、JDKAPI群側がGPLが適用されることになる(いわゆる「感染する」)かどうかが、少なくとも「グレー」になるわけです。場合によってはGPL違反になる、という解釈があるということです。そりゃないぜセニョール。

というようなことが、Javaで書かれたGPLプログラムがあまり見当たらない理由かと思いました。

Java APIには、互換品(GNU Classpath, apache harmony)が存在するので、glibcのようにLGPLであったり、リンク例外を持つべきなのかもしれません(向きは逆で、Java API側ではなく、「GPLJavaアプリが」)。