JavaのソースをDebianでコンパイル
筆者は、開発環境はWindowsのGUI、本番環境はDebianのCUIというケースが多いのですが、規模の小さいコードの場合ざっくりとWindowsで作っておいて後は本番環境で調整したいというケースがあったりします。
その場合の作業方法を覚書としてまとめておきました。
文字コードの問題
いつも設定を忘れてしまうのですが、WindowsのEclipseをデフォルトで利用していると文字コードはMS932になります。
このままの状態でソースコードをDebianに持っていきコンパイルすると文字コードエラーが出ます。
これを避けるためには、 Let'sプログラミング:「ソースファイルのエンコーディングを指定してコンパイルする」 によれば、Debianのjavacのオプションで「-encoding MS932」を指定するか、「-J-Dfile.encoding=MS932」とします。
後者は何をやっているかわかりづらいかもしれませんが、-JオプションはJVM(Java Virtual Machine)に対するオプションで、-Dプロパティ=値で、システムプロパティの値を設定する指定となります。
毎回オプションを指定するのが面倒だという時はEclipseのエンコードを変更する方法もあります。
「Window」→「Preferences」→「Workspace」の「Text file encoding」をOtherにして、「UTF-8」に変更します。
ただこれだけだと、既存のファイルの文字コードは変換されませんので、マーケットプレイス(「Help」→「MarketPlace」)で、文字コードを変換できるプラグインをインストールして処理します。
そこに「Autodetect Encoding」という、文字コードや改行コードを検知、表示、変換できるプラグインがあったのですが、変換をまとめて行うことができなかったため採用を断念しました。ちなみに、このプラグインの使い方はコード毎に画面右下に文字コードや改行コードが表示されるのでs、そこを右クリックして変換したいコードを選択するというものになります。
そんなわけで、マーケットプレイスでは目的のものを見つけられなかったため、PowerBeansさんのプラグインを利用させていただきました。ダウンロードしたjarファイルをpluginsフォルダ内に設置するだけでPackage Explorerの右クリックメニューに「文字コード変換」メニューが追加されました。少し古いものだったのですが、Version: 2021-03 (4.19.0)のEclipseで試したところ問題なさそうでした。
コンパイル環境の構築
まずJDKをインストールします。筆者のDebian環境は32bit環境だったので、選択肢が非常に限られておりopenjdk-8-jdk (8u292-b10-0+deb9u1)をaptでインストールして使うことになりました。
64bit環境ならAdoptOpenJDKなどから、ダウウンロードが可能です。
任意のデイレクトリを作成し、その下に次の3つのサブディレクトリを作成します。
- src
WindowsのEclipseからコピーした.javaファイルを入れるフォルダです。所属するパッケージに違いがあっても全部まとめてこのディレクトリに入れます。
- lib
依存ライブラリを保存するディレクトリです。
- bin
コンパイル後のclassファイルを出力するディレクトリです。
ファイルのコピー
ファイルのコピーはWindowsのエクスプローラーから、eclipseのワークスペース→プロジェクト名フォルダからソースを見つけてもいいですが、EclipseのPackage Explorerで目的のファイルをを選択した状態で右クリックコピー後に目的のフォルダにペーストする方が楽です。
コンパイルと実行
コンパイルは次のようにします。-cpでlibディレクトリにあるライブラリを指定し、srcディレクトリにあるすべてのファイルを対象とし、-dオプションでbinディレクトリに出力します。
ここで出力されるclassファイルは、package行の記載に沿って階層化されて出力します。src直下にjavaファイルがなく複数のディレクトリに分かれている場合は、スペースで区切って複数指定します。ワイルドカードはパスのセパレータ(/)を含むことができません。
文字コードをMS932のまま保存していたら先に案内したように「-encoding MS932」をコマンド中に含める必要がありますが、ここではUTF-8になっているとして例示します。
実行時は、-cpにbinデイレクトリを加えて実行します。Windowsで複数のcpを指定する場合は;(セミコロン)で区切りますが、Debian(Linux)の場合は:(コロン)を使います。