Windows 版 Eclipse で作った複数の Java ソースファイルを Mac でコンパイルするシェルスクリプトを作ってみた

この記事を書いた背景

Windows 版の Eclipse は、標準でソースコードが BOM 付きの UTF-8 形式で保存される仕様です。

これは別に仕様なので仕方がないのですが、先日研修系の仕事でたくさんのソースを扱うことがあり、かつコンパイル環境が Mac のときに問題が起こりました。

Mac 版の javac は BOM が付いているとコンパイルできないのです。
少なくとも自分がリファレンス読んだ限りではオプションなども見つかりませんでした。

これだと動作チェックもできないので、なんとかコンパイルできるようにしたいと思ってやったことのメモです。

解決方法

解決するには BOM を削るしかありませんでした。
つまり、ソースコードを編集するということですね。

そのために作ったシェルスクリプトが次のものです。

ソースコードは「JavaProgram.java」で統一されており、
1つずつ「5xxxx」というディレクトリに保存されている前提です。

#!/bin/sh

for dirname in `ls -d * | grep -G ^5`
do
    cd $dirname
    # ソースファイルからBOMを削除
    awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' JavaProgram.java > JavaProgram_out.java
    # 一時ファイルの削除
    rm JavaProgram.java
    # BOM削除済みファイルのリネーム
    mv JavaProgram_out.java JavaProgram.java
    # コンパイル
    javac -J-Dfile.encoding=UTF-8 JavaProgram.java
    # 実行
    java -Dfile.encoding=UTF-8 JavaProgram
    cd ..
done

以下ソースコードの解説です。

全体のループ

for dirname in `ls -d * | grep -G ^5`
do
〜
done

for によって全体をループさせています。
ディレクトリは「dirname」変数に入れています。

`ls -d * | grep -G ^5`

ディレクトリの取得は、
「ls -d *」で項目名のみに絞った一覧を作成し、
「grep -G ^5`」で先頭文字列が「5」のものだけに絞りました。

BOM の削除

awk 'NR==1{sub(/^xefxbbxbf/,"")}{print}' JavaProgram.java > JavaProgram_out.java
rm JavaProgram.java
mv JavaProgram_out.java JavaProgram.java

BOM の削除は awk を使っています。

awk で先頭3バイトが「EFBBBF」であれば削除し、「JavaProgram_out.java」に書き出します。
「rm JavaProgram.java」で元ファイルを削除し、
「mv JavaProgram_out.java JavaProgram.java」で awk を通して書き出したファイルを元のナマエに戻しています。

あとはコンパイルして実行しています。

まとめ

UTF-8 を使うなら、BOM 対応ぐらいはして欲しいものです。。

え?Webサイトのバックアップ、してないの!?

いざという時には復旧までしてくれる
『ワードプレス外部バックアップサービス』

■3つの特長
・自分でやらなくて良い
・いざという時の復旧付き
・外部サーバーにバックアップ

コメントを残す