- PR -

「Could not find the main class」の回避方法

投稿者投稿内容
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-22 10:57
Kissingerさんありがとうございました。

ためしにSwingアプリケーションを作って実行した所、JARファイルのダブルクリックで実行できました。
という事は、今回問いかけさせて頂いた本来の目的は、
MANIFESTでSWTのライブラリを指定する事により回避できるのではないかと思います。
→早速調べていこうと思います。(図々しいお願いですが、もし分かりやすいサイトや書籍等があれば教えて頂いても宜しいでしょうか。)
あと、DBとの接続は、JDBCも指定する必要があるという認識で宜しかったでしょうか。

ただ、一つだけ分からなかったのが、
テキストで作ったjavaファイルをコンパイルして作った、classファイルを
java exec
という形で実行できない事です。
クラスパスはこの場合、直接クラスを指定するので必要ないと思います。(多分)
書籍にはこの形で実行しているケースばかりなので、少し疑問の残る所です。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-22 11:06
>java exec
>という形で実行できない事です。
うーん・・・さっき書いたつもりなのですが、もう一度。
>java exec.Exec
とすべきではないでしょうか。 パッケージも指定しないとどこのパッケージに属する Exec クラスを実行してほしいのか区別つきませんからね。
しかもクラス名ではなくパッケージ名だけを指定していますね。そんな例がでている参考書はないと思います。一応ご確認ください。

追記:
失礼致しました、すでに >java exec.Exec は試していたんですね。
>java exec.Exec と java -cp exec Exec
>を実行しましたが、
>Exception in thread "main" java.lang.NoClassDefFoundError: exec
>と出てしまいます。
クラスパス上に適切にクラスファイルが配置されているか確認しましょう。
>java -cp exec Exec
の場合は exec ディレクトリ直下に Exec.class (パッケージなし)が配置されている必要があります。
>java exec.Exec
の場合はクラスパス内(CLASSPATH環境変数を指定していない場合はカレントディレクトリ)の excec ディレクトリ直下に Exec.class (execパッケージのクラスとしてコンパイルされているもの)が配置されている必要があります。

[ メッセージ編集済み 編集者: インギ 編集日時 2005-09-22 11:20 ]
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-22 11:25
インギさんありがとうございます。

java exec.Execでは、
Exception in thread "main" java.lang.NoClassDefFoundError: exec/Exec
と表示されてしまいます。

先程の件は、exec.classのクラスファイルだけを単体で作成し、
java execを実行したのです。
すみません、ややこしい記述をしてしまいました。

いかがでしょうか。仰って頂いた内容を理解できているかどうかが不安なのですが、
間違っていたら、またご指摘頂けますでしょうか。
よろしくお願い致します。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-22 11:41
パッケージ名とクラス名が大文字小文字の違いだけなので、ちょっと混乱してきました。
パッケージの宣言をせず、クラス名が "exec" なのであれば
>java exec
で実行できるはずです。
この場合 exec.class は CLASSPATH 環境変数に指定されているディレクトリまたは、カレントディレクトリ(CLASSPATH環境変数を指定しない場合)に配置されている必要があります。

パッケージが exec、クラス名が Exec の場合は
>java exec.Exec
で実行できるはずです。
CLASSPATH環境変数が指定されていない場合は
カレントディレクトリ/exec/ 以下に Exec.class が配置されている必要があります。

特にディレクトリ構成や CLASSPATH 環境変数をご確認ください。

[ メッセージ編集済み 編集者: インギ 編集日時 2005-09-22 11:42 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-22 11:50
>あと、DBとの接続は、JDBCも指定する必要があるという認識で宜しかったでしょうか。
そうです。必要なライブラリは展開して丸々 jar に含めるか、MANIFEST.MF の Class-Path 属性で指定してやる必要があります。
http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#Main%20Attributes

>MANIFESTでSWTのライブラリを指定する事により回避できるのではないかと思います。
>→早速調べていこうと思います。(図々しいお願いですが、もし分かりやすいサイトや書籍等があれば教えて頂
>いても宜しいでしょうか。)
マニフェストでネイティブのライブラリを指定する方法は(たぶん)ないです。
これ↓なんか参考になるのではないでしょうか。
http://www.javalobby.com/forums/thread.jspa?threadID=15512&tstart=0
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-22 14:02
インギさん。ありがとうございます。

なるほど。という事は、SWTも分からなくなったら全部jarに含めてしまえば良いという事ですね。
光が見えてきました。ありがとうございます。

あと、exec.classに関してですが、カレントフォルダで実行すると、
C:\JARTEST>java Exec
Exception in thread "main" java.lang.UnsupportedClassVersionError: Exec (Unsuppo
rted major.minor version 49.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)

という内容が出てきてしまいました。ちょっと内容が変わったのでまた調べようと思います。

あと、参考URLありがとうございました。
しっかり勉強しようと思います。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-23 00:15
>なるほど。という事は、SWTも分からなくなったら全部jarに含めてしまえば良いという事ですね。
ん・・そういう事になるかな???
先の参考URLをよく見て色々試してみてください。

UnsupportedClassVersionError については調べればすぐ原因がわかると思います。がんばってください。
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-23 14:12
インギさん、Kissingerさん、ありがとうございました。
色々試して見ようと思います。

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