初めて投稿させていただきます。
私は、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件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
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内に記述しておくと、コンパイルは通るのですが実行時にエラーがはかれてしまうんです。
こちらをたてればあちらがたたずと言った状況になってしまいます。これが何とか回避できればと思っているのですが・・・。
No.2
- 回答日時:
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が共に持っているクラスやメソッドに関してがどうしてもうまく行かないんです。
No.3
- 回答日時:
すみません。
私は Sun の JDK で Microsoft のクラスを呼ぶソースコードをとりあえずコンパイルができる(それを Microsoft VM で実行できる)ということだけ書きたかったのです。
Sun の環境での実行については、No.1 の回答の、
> あとは、実行環境の移行ですが、これが難しくて分かりません。
のとおり分かりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java jdk17.06のインストーラーが起動しない 1 2023/03/27 21:58
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java JavaでWebページ作成 7 2023/07/21 21:09
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java mac mini 2009 でのmac OS における Java の入れ替えについて 1 2022/12/27 19:23
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java Javaについて、mathクラスを使わずに15➗3の結果を切り上げる方法を教えてください…!! 3 2023/04/28 21:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パッケージ org.gjt.mm.mysqlは...
-
.jarファイルの中身って書き換...
-
javaが文字コードの影響でコン...
-
exlipseでデバックエラーが発生...
-
「識別子がクラス名でも名前空...
-
HelloWorldのソースがコンパイ...
-
配列に対してsetText()は使えな...
-
Borland 5.5の環境設定について
-
TOMCAT_HOMEって?
-
javaの簡単なソースがコンパイ...
-
サクラエディタでjavaのプログ...
-
LaTeXでのアンダーバーの入力
-
classファイルをjavaファイルへ。
-
【Java】始めたばかりでつまづ...
-
TeXで図を挿入できません.助け...
-
javax.servlet は存在しません...
-
逆コンパイルの見方について
-
同一パッケージ内の継承について
-
Eclipse3.5EEでJavaのコンパイ...
-
antでコンパイルするとき
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
.jarファイルの中身って書き換...
-
IIS環境でJAVAを使用したい
-
javaが文字コードの影響でコン...
-
Eclipse3.5EEでJavaのコンパイ...
-
コンパイルエラーに出てくる、i...
-
サクラエディタでjavaのプログ...
-
Javaのコンパイル結果が表示さ...
-
javax.servlet は存在しません...
-
eclipseの構文エラーについて
-
javaの簡単なソースがコンパイ...
-
「識別子がクラス名でも名前空...
-
eclipseの設定のJREとコンパイ...
-
dokojavaのコンパイルについて
-
逆コンパイルの見方について
-
exlipseでデバックエラーが発生...
-
eclipseについて
-
classファイルを元に戻す
-
日本語対応 逆コンパイラについて
-
コンパイルができないのですが...
-
java サーブレットのサンプルプ...
おすすめ情報