Skype連携ソフトの複数デバッグを一つのマシンで行えれば、やりとりを行うソフトの開発が非常に楽になります。
ですので、今日はこの方法を探ってみました。
まずは、Skype自体を複数アカウントで起動します。
その方法は、以前のitmediaの記事
「Skypeを2つ同時に起動する」に詳しいです。
上記記事では、Windowsに標準搭載のrunasコマンドを使っています。
ですが、毎回パスワード入力するのが面倒であれば、
等をインストールして使う手もあります。
次はSkype連携ソフト自体を複数アカウントで起動する方法です。
通常のEclipseの起動オプションでは、別アカウントでJavaアプリケーションを起動という選択肢がありません。
いろいろ探しましたが、このような目的を実現するEclipseプラグインも発見することができませんでした。
となると、自分でプラグインを作るしかありません!
最初はEclipseのアプリケーション起動関係のフレームワークについて、
「The Launching Framework in Eclipse」を読んで調査します。
その後、EclipseのJavaアプリケーション起動のコードを読んでいくと、内部ではjava.lang.Runtime#execを呼び出してプロセスを起動していることが分かりました。
起動後は、java.lang.Processインスタンスがそのまま保持されて制御に使われています。
Processインスタンスを使わない形に変更してプラグインを実現するとなると非常に多くのコード修正が必要そうです。
ですので、この仕組みはそのまま使う形でプラグインを実装することにしました。
方向性が固まったので、次は別アカウントで実行されたプロセスに結びつくjava.lang.Processインスタンスを生成する方法を考えなければいけません。
Processクラスを拡張 + JNI等を使って、別アカウントでのJavaアプリケーションと結びつく独自のクラスを作ることも可能ですが非常に大変です。
ですので、上記のRunAsXコマンドを使ってラップして実現します。
java.lang.Processインスタンスを作る前に、RunAsXコマンドを使う形にコマンド文字列を修正して、java.lang.Runtime#execに渡す方法です。
この仕組みを実現するため、既存のメソッドの一部を変えたいのですが、Eclipseの既存のクラスがこのような拡張を意図して作られていません。
ですので、メソッドレベルではなく、クラスレベルで構造を変える形で挑戦してみます。
結構なコード量が必要でしたが、この形で別アカウントでの起動に成功しました!!!
起動に成功したので、設定を行う起動ダイアログ等も作り込んでみました。
このプラグインで別アカウントのJavaアプリケーションをデバッグしている画面です。
残りの問題や改良を加えたら、Skype連携ソフト開発用Eclipseプラグインとして公開したいと思います。