プロが教えるわが家の防犯対策術!

初めて投稿させていただきます。

私は、EXEを作れる、DLLに触れるというメリットでMicrosoft SDK for Java 4.0を使っていたのですが、2007年にMicrosoftが完全にサポートを打ち切ってしまうことからSunのJDKに開発環境を移行しようと考えています。

そこで、MSが提供していた独自クラスをSunのJavaで使えないかと思って調べています。
具体的にはまず、MS Javaで使われているクラスファイルを吐き出すためにコマンドプロンプトで

> clspack /auto

として、classes.zipを作成しました。これをSunのJavaをコンパイルするときに

> javac -cp C:?WINDOWS?Java?Classes?classes.zip hoge.java
> javac -Xbootclasspath C:?WINDOWS?Java?Classes?classes.zip hoge.java

とすると、コンパイルは通るのですが、

> java hoge
> java -cp C:?WINDOWS?Java?Classes?classes.zip hoge
> java -Xbootclasspath C:?WINDOWS?Java?Classes?classes.zip hoge

等として、実行しようとすると次のようなエラーが表示されてしまいます。

Exception in thread "main" java.lang.NoClassDefFoundError: com/ms/win32/User32 at hoge.main(hoge.java:4)

Exception in thread "main" java.lang.NoClassDefFoundError: hoge

Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/security/ProtectionDomain

ちなみに、hoge.javaはMSのクラスが使えるかを確認するために作ったサンプルです。ソースコードは以下のような内容です。

import com.ms.win32.*;
class hoge{
 public static void main(String[] args){
  User32.MessageBox(0,"Hello.","Java!!",0);
 }
}

MSの提供しているクラスを使うことは出来ないのでしょうか?また、MS以外のものでデバイスにアクセスすることを可能にするクラスは提供されていないでしょうか?

A 回答 (3件)

Microsoft のサポート云々を気にされるのでしたら、開発環境(コンパイラー)だけでなく、ライブラリー(com.ms.win32 パッケージなど)も結局サポートされないことになるので、Microsoft のライブラリーだけは使い続けるというのはそれほど意義がないような気もします。


(お勧めするソリューションは .NET(C#) へ移行するか、Sun の Java から JNI 経由で native に DLL にアクセスするかのいずれかです。)



ともあれ、とりあえず、以下、中途半端な回答ですが、Sun の環境でコンパイルはできたことだけ書きます。

試した環境は、
・Microsoft SDK for Java 4.0 なし。
・Microsoft VM(Microsoft の Java のランタイム) あり。
・Sun の JDK 1.4.2 あり。
です。
コンパイル時につぎの引数を指定してコンパイルします。
C:\j2sdk1.4.2\bin\javac -target 1.1 -classpath C:\WINDOWS\JAVA\Packages\Wg2zl39v.zip Hoge.java

これでできた Hoge.class を使って
jview Hoge
とやって Microsoft VM(jview.exe) 上では動きます(メッセージボックスが表示される)。

以上で、コンパイル環境は移行できたことになります。
要は、Sun JDK の 1.4 あたりのバージョンを使って -target 1.1 を指定するだけです(1.5 でもできるのかもしれませんが良く知りません)。

あとは、実行環境の移行ですが、これが難しくて分かりません。

なお、余談ですが上記の Wg2zl39v.zip のようなファイル名は環境依存するのかもしれません。
ちなみに、

> 具体的にはまず、MS Javaで使われているクラスファイルを吐き出すためにコマンドプロンプトで
>
> > clspack /auto
>
> として、classes.zipを作成しました。

こういうツールがあることを私は知りませんでしたが、おそらく同じことでしょう。

この回答への補足

お答えありがとうございます。

> コンパイル時につぎの引数を指定してコンパイルしま> す。
> C:\j2sdk1.4.2\bin\javac -target 1.1 -classpath > C:\WINDOWS\JAVA\Packages\Wg2zl39v.zip Hoge.java
>
> これでできた Hoge.class を使って
> jview Hoge
> とやって Microsoft VM(jview.exe) 上では動きます
> (メッセージボックスが表示される)。

確かに、-targetオプションを付けるとコンパイルはhoge.javaのコンパイルと実行はできるようになるのですが、targetで1.1を指定するとSunのJavaで1.2以降に追加された関数が見つからない(java.lang.NoSuchMethodError)となってしまうんですよね。例えば、StringBufferのsubstringはver 1.2から追加されたメソッドなんですが、このメソッドをhoge.java内に記述しておくと、コンパイルは通るのですが実行時にエラーがはかれてしまうんです。

こちらをたてればあちらがたたずと言った状況になってしまいます。これが何とか回避できればと思っているのですが・・・。

補足日時:2006/06/04 19:28
    • good
    • 0

Microsoft の Java (Microsoft VM) は JDK のバージョン 1.1.4 相当のものです(と聞きます)。

したがって Microsoft VM 上で NoSuchMethodError を回避するためならば、1.1.4 までのクラスやメソッドだけを使ってコーディングすれば大丈夫です。ただ、どのクラスやメソッドが 1.1.4 に含まれていないかが分からないので、これは慣れしかないでしょう。簡単には Sun から JDK 1.1.4 相当の環境をダウンロードして使えば良いでしょう。たいていは 1.1 の最新である 1.1.8 で間に合うと思います。
しかし、こんどは Sun が JDK バージョン 1.1 をサポートし続けているのかどうか、ということになり、本末転倒かもしれませんが。

参考URL:http://java.sun.com/products/archive/index.html

この回答への補足

> Microsoft の Java (Microsoft VM) は JDK のバージョン 1.1.4 相当の
> ものです(と聞きます)。したがって Microsoft VM 上で
> NoSuchMethodError を回避するためならば、1.1.4 までのクラスやメ
> ソッドだけを使ってコーディングすれば大丈夫です。

それはそうなんですが、私がやりたいのはMSが独自で作ったクラスを使いつつ、Sunのjdk1.2以降のクラスやメソッドも使えるようにすると言うことなんですよね。

やっぱ、無理なんですかね~。
SwingはJ2SE 5.0のものを使うことができたんですが、他のMSとSunが共に持っているクラスやメソッドに関してがどうしてもうまく行かないんです。

補足日時:2006/06/05 13:06
    • good
    • 0

すみません。


私は Sun の JDK で Microsoft のクラスを呼ぶソースコードをとりあえずコンパイルができる(それを Microsoft VM で実行できる)ということだけ書きたかったのです。

Sun の環境での実行については、No.1 の回答の、

> あとは、実行環境の移行ですが、これが難しくて分かりません。

のとおり分かりません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!