- PR -

Linux環境とCygwin環境の違いについて

投稿者投稿内容
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-10-06 19:14
正確な状況が分かれば、アドバイスもしやすいです。

たとえば、

- プログラムそのものについて
(なんのプログラムなのか、必要なライブラリとか)
- javaコマンドに渡したパラメータ
- 環境変数の値(JAVA_HOME, CLASSPATHなど)
- エラーメッセージ全文

かなぁ。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-10-06 21:22
推測ですが、
もしかして javaをsh(/bin/sh, /bin/ash, /bin/bash) から起動していませんか?

shでセミコロンはコマンドの区切りですので、

仮に「java -cp a.jar;b.jar」とすると、「java -cp a.jar」「b.jar」の2つのコマンドと見なされます。

「b.jar」は実行できませんので、shがcannot execute binary file エラーを出すのではないかと思います。

なお、このテのエラーは「sh -x シェルスクリプト名」で実行すれば判別できると思います。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-10-06 21:37
ついでに、/bin/sh と /bin/bash からエラーメッセージを探してみました。

手元では次のバージョンを使っています(更新をさぼっているので古い)。
$ cygcheck -f /bin/sh /bin/bash
ash-20040127-1
bash-2.05b-17

この2つから、エラーメッセージ 'cannot execute binary file' を探してみます。

$ strings /bin/sh.exe | grep 'execute binary'

$ strings /bin/bash.exe | grep 'execute binary'
%s: cannot execute binary file
%s: cannot execute binary file
%s: cannot execute binary file

よって、bashのエラーメッセージのようです。
未記入
会議室デビュー日: 2005/10/06
投稿数: 7
投稿日時: 2005-10-11 10:11
再び回答ありがとうございました。
金曜日お休みだったのでお返事が遅くなってしまいました。

ちいにぃさんのおっしゃる通り、cygwinのbash上でjavaを実行していたので、クラスパスの設定をコロンからセミコロンに変更することによって、セミコロン以下が次のコマンドと認識されたようです。

それからおっきーさんからご指摘頂きました点ですが、確かに情報が少なすぎました。
以下に記述いたします。

- プログラムそのものについて
このプログラムは下位のモジュールを実行し、その結果をpostgreSQLのDBに反映するというものです。

- javaコマンドに渡したパラメータ
javaに渡した引数は-classpathで自分で作成した.jarファイルを指定しているだけです。
他のオプションは指定していません。

- 環境変数の値(JAVA_HOME, CLASSPATHなど)
JAVA_HOME=/cygdrive/C/j2sdk1.4.2_09
CLASSPATHの指定はなしです。

- エラーメッセージ全文
java.lang.NoClassDefFoundError; sensornet\\rs\\main\\Main
Exception in thread "main"

以上となっております。
現状は、先週と変わっておりません。
もし何かお気づきの点がありましたら教えていただけると幸いです。
よろしくお願いします。
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-10-11 10:40
引用:


- javaコマンドに渡したパラメータ
javaに渡した引数は-classpathで自分で作成した.jarファイルを指定しているだけです。
他のオプションは指定していません。

- エラーメッセージ全文
java.lang.NoClassDefFoundError; sensornet\rs\main\Main
Exception in thread "main"




どんなパラメータを渡しているかは、
もう少し正確な方がよいですよ。

たとえば、

cygwin コマンドライン上で以下のコマンドを実行、

java -classpath foo.jar sendornet.rs.main.Main

でよろしいですか?

エラーメッセージを見るとJAVA_HOMEの設定はうまくいっているみたいですが、
実行したいクラスのクラスパスが通ってないみたいですね。

できることは、

- jar ファイルのクラスパスの設定を確認する。
- jar ファイルに sensornet.rs.main.Main クラスが存在するかどうかを確認する。

位でしょうか。

おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-10-11 10:53
普通にGoogleで "java Cygwin classpath" でよいページが見つかりました。

http://www.02.246.ne.jp/~torutk/javaoncygwin/javaoncygwin.html

クラスパスを複数渡す場合はちょっとコツがいるみたいですね。


[ メッセージ編集済み 編集者: おっきー 編集日時 2005-10-11 10:55 ]
未記入
会議室デビュー日: 2005/10/06
投稿数: 7
投稿日時: 2005-10-11 11:56
おっきーさんありがとうございます。
今までネットでもいろいろ調べてきたんですが、この教えて頂いたページは見ていませんでした。
このページの通り、クラスパスの指定を-classpath `cygpath -wp cygwin上でのパス`とすることで、ようやく今まで出てきたjava.lang.NoClassDefFoundErrorはなくなりました。
やはりクラスパスの指定がいけなかったようです。
またこのcygpathを使うことで、cygwin上での仮想パスをwindows上での実パスに変換してくれるだけでなく、複数のクラスパスを指定する時のセミコロンにも\\をつけてくれるようです。
現状はまだ、その後ろで止まってしまっているので、環境構築には今しばらく時間がかかりそうですが、今まで本当にお世話になりました。
大変勉強になりました。
今回の私の経験が、今後の人にも役立てばいいと思います。
助けて頂いた方々本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)