アーティファクトのビルド
💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。
プログラムが動くようになったら、出荷できるものをビルドできます。Java クラスファイル、JAR ファイル、スタンドアロンな fat JAR ファイル、あるいは Flix パッケージです。
このうち普段よく使うのは 2 つです。プログラムをエンドユーザーに配布する場合は fat JAR ファイルです。Java が動く環境であればどこでも単独で実行できるからです。他の Flix 開発者とライブラリを共有する場合は Flix パッケージです。
プロジェクトのコンパイル
build コマンドを使うと、プロジェクトをコンパイルできます。build コマンドはコード生成を含めてプロジェクト全体をコンパイルしますが、ディスクには何も書き込みません。プロジェクト全体がコンパイルできることを確認するために使います。
クラスファイルのビルド
build-classes コマンドを使うと、プロジェクトを Java クラスファイルにコンパイルできます。Flix はクラスファイルを build/class ディレクトリに書き出し、プロジェクトに main 関数があれば、java で実行できます:
$ java -cp build/class Main
Hello World!
クラスファイルは、出荷したいものとしてはあまり適していません。ディレクトリをまとめて保持しなければならず、すべての依存関係を自分でクラスパスに追加する必要もあります。プログラムを他の人に渡すには、代わりに fat JAR ファイルをビルドします。
注意: プロジェクト自体、またはその依存関係のいずれかが JAR ファイルに依存している場合は、それらもクラスパスに追加する必要があります。
JAR ファイルのビルド
build-jar コマンドを使うと、JAR ファイルをビルドできます。Flix は JAR ファイルを artifact ディレクトリに書き出し、プロジェクトのディレクトリ名にちなんで命名します。例えば hello-world というディレクトリのプロジェクトなら artifact/hello-world.jar になります。これは java で実行できます:
$ java -jar artifact/hello-world.jar
Hello World!
この JAR ファイルには、プロジェクトのクラスファイルと、プロジェクトに resources ディレクトリがあればその中のファイルが含まれます。
注意:
build-jarコマンドはプロジェクト自体をコンパイルします。事前にbuildやbuild-classesを実行する必要はありません。
このようにビルドされた JAR ファイルには、プロジェクトの依存関係は含まれません。プログラムが(依存関係の使用 で説明するような)Java ライブラリなど何らかの依存関係を使っている場合、この JAR ファイルを実行すると JVM がそれを見つけられずに失敗します:
$ java -jar artifact/inventory.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
対応方法は 2 つあります。依存関係を自分でクラスパスに追加するか、JAR ファイルにバンドルするかです。
fat JAR ファイルへの依存関係のバンドル
build-fatjar コマンドを使うと、すべての依存関係をバンドルした JAR ファイル、すなわち fat JAR ファイルをビルドできます。Flix は同じ場所にこれを書き出し、これでプログラムは単独で動作するようになります:
$ java -jar artifact/inventory.jar
!dlroW olleH
fat JAR ファイルには、プロジェクトのクラスファイル、resources ディレクトリ内のファイル、そしてプロジェクトが依存するすべての JAR ファイルの内容、つまり Flix と Maven のすべての依存関係が含まれます。
注意:
build-jarコマンドとbuild-fatjarコマンドは、同じ JAR ファイルに書き込みます。最後に実行したどちらかのコマンドの結果が残ります。
注意:
build-fatjarコマンドはプロジェクト自体をコンパイルします。事前にbuildやbuild-classesを実行する必要はありません。
Flix パッケージのビルド
build-pkg コマンドを使うと、プロジェクトを Flix パッケージにまとめることができます。Flix はパッケージを artifact ディレクトリに書き出し、その隣にマニフェストをコピーします:
artifact
├── flix.toml
└── package.fpkg
この 2 つのファイルこそがリリースの中身であり、パッケージの公開 で説明する release コマンドがアップロードするものでもあります。どちらのファイルも固定された名前を持ちます。パッケージはプロジェクトの名前やビルドされる場所にかかわらず package.fpkg と呼ばれます。これにより、リリースのファイルは何も読み込まなくても、リポジトリとバージョンだけで参照できます。
注意: JAR ファイルはこの規則に従いません。JAR ファイルは何もアドレスで取得しに来ないローカルなビルド成果物なので、
build-jarとbuild-fatjarは引き続きプロジェクトのディレクトリ名にちなんで命名します。そのため、hello-worldという名前のプロジェクトディレクトリでは、artifactディレクトリにpackage.fpkg、flix.toml、hello-world.jarが入ることになります。
Flix パッケージは、本質的にはプロジェクトのソースコードの zip ファイルです。マニフェスト、README.md、LICENSE.md、そして src にある Flix ファイルが含まれます。テストやコンパイル済みコードは含まれません。Flix パッケージは、それに依存する側がソースコードからコンパイルします。マニフェストとともに、パッケージの公開 で説明するように GitHub 上で公開できます。
注意:
build-pkgコマンドはまずプロジェクトをチェックし、コンパイルできないソースコードからのパッケージのビルドを拒否します。
注意:
build-pkgコマンドにはマニフェストが必要です。マニフェストのないパッケージは公開できないためです。
クリーンアップ
clean コマンドを使うと、build ディレクトリと artifact ディレクトリを削除できます。これにより、build-classes が書き出したクラスファイル、doc が書き出したドキュメント、そして build-jar・build-fatjar・build-pkg が書き出した JAR ファイルやパッケージファイルが削除されます。