
初めて投稿させていただきます。
私は、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.3
- 回答日時:
すみません。
私は Sun の JDK で Microsoft のクラスを呼ぶソースコードをとりあえずコンパイルができる(それを Microsoft VM で実行できる)ということだけ書きたかったのです。
Sun の環境での実行については、No.1 の回答の、
> あとは、実行環境の移行ですが、これが難しくて分かりません。
のとおり分かりません。
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.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内に記述しておくと、コンパイルは通るのですが実行時にエラーがはかれてしまうんです。
こちらをたてればあちらがたたずと言った状況になってしまいます。これが何とか回避できればと思っているのですが・・・。
お探しの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ランキング
-
jdbcでinsert,delete,createをe...
-
プログラミングの問題です。大...
-
Googleログインボタンのデザイ...
-
JDONWROADER2のエラー修復
-
「main メソッドを持つクラスが...
-
Eclipse 動的プロジェクトで404...
-
正規表現について質問です。 カ...
-
スプレッドシートからリマイン...
-
googleスプレッドシートのスク...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JDONWROADER2のエラー修復
-
Googleログインボタンのデザイ...
-
配列にnullを代入すると、null...
-
jdbcでinsert,delete,createをe...
-
「main メソッドを持つクラスが...
-
プログラミングの問題です。大...
-
eclipseで作ったプログラムを他...
-
正規表現について質問です。 カ...
-
Eclipse 動的プロジェクトで404...
-
マイクラでPythonのプログラミ...
-
jdk17.06のインストーラーが起...
-
自作Androidアプリのデータ引き...
-
直し方について教えて頂きたい...
-
eclipse実行ができない
-
サーブレットをapacheで公開す...
-
あんまりお料理しないのに台所...
-
CSV出力を画面から選択したデー...
-
次のhtml・cssでspan内の文字を...
-
問題作成のWebアプリの作り方を...
-
ゲーム開発の入門書を探しています
おすすめ情報