すらいむがあらわれた

こまんど >  たたかう  にげる

Sharpenガイド - JavaをC#に変換する素晴らしいツール (A guide to Sharpen - a great tool for converting Java to C#)

以下のBlog記事の翻訳です。
A guide to Sharpen - a great tool for converting Java to C# / PaulDB.getWords()
http://www.pauldb.me/post/14916717048/a-guide-to-sharpen-a-great-tool-for-converting-java

JavaのライブラリをC#に変換して書き換えないといけなかったときがあってSharpenを使いました。使うにあたって一番の手がかりとなったのが上記の記事です。
個人的にこれからも何回かSharpenをつかいそうなので自分の為に翻訳してみました。
Google翻訳Yahoo!翻訳とどっこいのレベルですが、何が書いてあるのか雰囲気をつかむ手助けにでもなれば。

                                                                                              • -

Sharpenガイド - JavaC#に変換する素晴らしいツール

JavaをC#に移植したTipsに続き、Sharpenを動かす為に段階を踏んだガイドを書きました。

これは主にSharpenのドキュメントが最低限なので、普段EclipseとAntを使っている人でなければ紛らわしく、わかりにくいためです。私が見つけることができたわずかなチュートリアルも紛らわしいものでした。

SharpenはJavaC#の変換だけでなく言語間の文法とライブラリの違いをまとめるためにも素晴らしい仕事をします。
あなたが1000行のコードを含むJavaライブラリに直面しているとき、これは巨大な時間の節約になります。
詳細に入る前に、私がSharpenをワンストップポーティングソリューションではなくポーティング作業に取りかかるための手段としてみていることをはっきりことわっておきます。
あなたはSharpenの製造物を直す為に手間をかけるつもりでいるべきです。

さて、私の逃げ口上と共に、ガイドを始めましょう。
Sharpenはコマンドライン機能としても設定できるのですが、私はGUIツールで使い始めることに焦点を当てます。


前提条件
Eclipse. 必要なのはJava Developers versionです。ダウンロードしてインストールしてください。SharpenはEclipseプラグインなので普通にEclipseが必要となります。

・Sharpen. 公式のSharpenソースコードはメンテナンスされていないので使わないでください。githubのngitプロジェクトにLluis Sanchezの既にコンパイル済みの sharpen.core.jarがあるのでダウンロードしてください。
Sharpenに必要なのは以上です。
Lluisのバージョンはいくつかのバグフィックスがされており、そしてMonoDevelopチームがJGit のngit移植を同期し続けるためにShapenを使っているので、よりよくメンテナンスされています。

・Sharpen構成ファイル
実際のSharpenの変換処理はAntのビルドスクリプトを介して動作し、環境構成の為にプロパティファイルを使用します。
リファレンス文書からこれらがどのように動くのかを理解するのは苦痛でした。
物事を単純化するために、私は設定ファイルを少々連結し、LluisのnGitプロジェクトの設定ファイルと少々マージし、使われていない部分を少々取り除きました。
下の部分で後で使用する為に私の設定ファイルをダウンロードして解凍してください。

・Sharpen C# ユーティリティクラス
Sharpenは特別なユーティリティクラスのセットで、多くのJavaメソッドシグネチャを保持します。これでSubstring()のような一般的なメソッドC#Javaと一致しない箇所の問題を回避できます。 LluisはShapenのベースユーティリティをより多くのクラスで、私たちが磨き上げたいように自然に拡張しています。
nGitプロジェクトのSharpenフォルダにあるすべてのクラスをダウンロードしてください。


<余談>Visual Studioの人々のためのEclipse
あなたがもっぱらVisual Studioの世界の人ならばEclipseは少々奇妙な体験になるでしょう。
ここでEclipseの説明をするつもりはありませんが、理解する為の手伝いをします。

Eclipse ワークスペース = Visual Studio ソリューション
Eclipse プロジェクト = VS プロジェクト
Eclipse ビルドパス = VS プロジェクト リファレンス
Java JARs = .Net DLLs
Eclipse パースペクティブ = 異なる UI 構成 - VSをC#開発やVB開発やWeb開発に最適化するように設定できるようなもの。


EclipseJavaライブラリを開く

JavaライブラリがEclipse .projectファイルと一緒にあるか確認してください。ソースのルートフォルダのなかにあるべきです。
.projectファイルがあったら、以下を行ってください。
1. Eclipseをスタートします。
2. Eclipseワークスペースの場所を聞いてきたらデフォルトを選んでください。
3.“Welcome”スクリーンが開いたら、閉じるとJavaパースペクティブが現れます。
4. ファイル->インポートを選択します。
5. “一般->既存のプロジェクトをワークスペースへ” のオプションを選びます。”次へ”を押します。
6. ルートディレクトリを選択してJavaライブラリソースのルートを表示します。
7. Eclipseではプロジェクト一覧パネルの中に少なくとも1つのプロジェクトを入れるべきです。
8. 全てのプロジェクトが一覧表示されチェックされていることを確認して”終了”をクリックします。

もし.projectファイルがなかったらソースから新しいEclipseプロジェクトを作る必要があります。

1. ファイル -> 新規 -> プロジェクト へ移動します。
2. Java -> Javaプロジェクト を選択します。次へを押します。
3. プロジェクト名を入力します。
4. “デフォルトロケーションを使う”のチェックを外し、ロケーション欄でJavaライブラリのルートを表示します。次へを押します。
5. Java設定画面で、各種のライブラリフォルダがソースタブに入っていることを確認すべきです。
6. 任意の外部のjarファイルがあるかあなたのJavaライブラリフォルダを確認してください。
これらは普通ライブラリのルートディレクトリにある”lib”フォルダにあります。もしなにがあったら、それらがライブラリタブの一覧に載っているか確認する必要があります。もし無ければ、それらをライブラリタブの外部JARを追加するオプションを使って追加してください。
7. 終了をクリックしてプロジェクトを作成します。

Eclipseは自動的にプロジェクトをコンパイルし、VSのようにエラーを報告します。もしエラーが出たらそれらを修正する必要があります。Googleは友達です:)

Javaライブラリのコンパイルを確認します。Sharpenと一緒に動作させる為にコンパイルができていないといけません。


SharpenをEclipseプラグインとして追加する

SharpenのドキュメントにはいくらかのSharpenプラグインソースコードからビルドする方法が載っていますが、しかしながらLluisのGithubからダウンロードしたjarファイルのおかげでこの部分をスキップすることができます。

Eclipseがインストールされているルートフォルダの中にある”plugin”フォルダの中にSharpen jarファイルを単純にコピーします。SharpenはEclipseプラグインとしてピックアップされるようになります :)


JavaプロジェクトにSharpen構成ファイルとビルドファイルを追加する
自分の構成ファイル一式を解凍した場所からつかんで、Javaライブラリプロジェクトのルートに追加します。Eclipseワークスペースディレクトリの中にあるプロジェクトフォルダにファイル一式をコピーすればできます。

かならずJavaプロジェクトのルートに入れなくてはいけません。
それからファイルを以下のように編集します。


sharpen.properties

1. dir.workspace をEclipseワークスペースのルートに設定します。ディレクトリにはUnixスラッシュ(/)を使います。
2. file.jcm.jdk1.5をあなたのJDKインストール場所にあるjava.exeを指すように設定します。
もしJDKをインストールしていなかったら、入手してインストールしてください。
3. eclipse.home を あなたのEclipseインストール場所のルートに設定します。
4. eclipse.startup.jar があなたのEclipseルートのプラグインサブフォルダの中にある利用可能なeclipse.equinox.launcher jar に設定されていることを確認します。

これは大きな落とし穴です。
私は私のEclipseのバージョンが新しいnewer launcher jar (version 1.2)を持っていることに気がつくのに時間がかかりました。
なので、この設定があなたの launcher jar の名前と正確に一致しているか再確認してください。


run-sharpen.xml
これはAntビルドの定義です。私のCHECK THIS SETTINGコメントをみてください。

1. dir属性の が変換するJavaソースファイルを含むJavaライブラリのブフォルダに設定されていることを確認してください。
これは通常”src”フォルダですが、”test”フォルダを含むユニットテストがあるときはJavaコードを変換するために一度Sharpenをdir = srcで動かして、そしてもう一度 dir = test で動かす必要があるでしょう。

2. あなたのJavaプロジェクトが参照する全ての外部JARファイル がの値とパスのペアで一覧されていることを確認します。私がファイルに含めたサンプルを参照してください。(それらを消すことも忘れないでください!)
あなたのプロジェクトの外部JAR参照の一覧を得るには、パッケージエクスプローラでプロジェクトを右クリックして、ビルドパス -> ビルドパス構成へ移動してライブラリタブをチェックします。
SharpenはあなたのJavaプロジェクトを変換する前にビルドします - これが全ての外部参照JARについて知っていなければならないことの理由です。


sharpen-all-options

このファイルはSharpenがどのようにJavaコードを変換するかをカスタマイズできるものです。Sharpenドキュメントはかなりよくこれらのオプションの概要を示しています。
私が含めたこのオプションファイルはLluis’のものを元にしていますが、あなたが望むように編集してください。
あなたがやるべき変更の一つは全ての変換されたcsファイルでJavaライブラリの基本ネームスペースをC#スタイルのものに変えることです。
これをやるには、サンプルの“-namespaceMapping org.mylibrary NMyLibrary”の行を必要に応じて編集してください。


header.txt

このファイルに入っているテキストは自動的に全ての変換されたCSファイルの先頭に追加されます。これを必要に応じて編集してください。私の馬鹿げたメッセージを消した方がいいでしょう。
Javaライブラリのライセンス宣言と条件を尊重していることを確認して下さい。.NETに移植することでライセンスから免れることにはなりません。

やれやれ。よし、構成とセットアップができました。
今、あなたのJavaコードを変換する準備が整いました!


Sharpenを動かす

1. パッケージエクスプローラでrun-sharpen.xmlファイルを右クリックし、実行 -> Antビルドへ移動します。
2. コンソールペインが立ち上がると、Antが動作し始めているはずです。最後にBUILD SUCCESSFULメッセージを見られるのを期待しましょう。
3. 変換されたC#ファイルはあなたのJavaプロジェクトルートフォルダのsharpen/sharpened.net サブフォルダに出力されます。Windowsエクスプローラを開いてそこに移動し多くの.csファイルがあるのをみて喜びましょう :)


C#プロジェクトにSharpenユーティリティクラスを追加しよう

今、あなたがSharpenで膨大な数の行のJavaをC#に20秒で変換しているので、あなたは自然に変換されたソースを.NETプロジェクトに追加したいと望むでしょう。

実行したとき、Sharpenクラスがが無いことに関連するコンパイルエラーのスタックが見られると思います。
これはSharpenが生成したC#コードがいくつものJavaとC#の間のメソッドシグネチャのギャップを仲介するユーティリティクラスを使っているからです。

これは簡単に整理できます。前提条件セクションでダウンロードしたSharpenフォルダーをVisual Studioのあなたのプロジェクトに追加します。そのSharpenフォルダの中で見つかったすべてのcsファイルを含めるようにしてください。


さあつらい仕事が始まります...

この段階では、全てはSharpenの部分でやったように簡単であるべきです。
単にC#コードがコンパイルされないだろうというだけです :)

Shapenは出来る限りコードを変換しますが、あなたがまだ移植を完成させてコンパイルするために力仕事をしなければいけないことを忘れないでください。

良いニュースはあなたが今、動かすために生成されたC#という偉大な出発点を持っていることです。