- PR -

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

投稿者投稿内容
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-22 08:13
EclipseでSWTアプリケーションを開発しております。
ある程度形になってきたので、そろそろ配布をしようと思い、エクスポートでJARファイルを作成しました。
ところが、そのJARファイルは、どうやっても動いてくれません。
「Could not find the main class」と毎回出てしまいます。
JARファイルやマニフェストに問題があるのかと思い、
テキストエディタでコンソール上に、文字が出るだけのプログラムを作成し、実行しました。(コマンドプロンプトでテキストファイルをjavac→javaで実行)
それでも同じエラーが出てしまいます。

javaを勉強し始めて半年強、しかも独学なので、恐らくJAVAの初歩的な設定等がおかしいのではないかと思います。
書籍では、このエラー部分に触れてはいなかったので、どうすれば良いのか全く分からなくなりました。何を調べると解決に向かうのかも不明な状態です。

漠然とした質問で大変恐縮ですが、どなたか助けて頂けませんでしょうか。
よろしくお願い致します。

ちなみにプラットフォームは
OS:windows XP
java:1.5.0_04と1.4.2_07(両方ともダメでした)
java関連のソフトウェア:Eclipse,Oracle Jdeveloper10g,Oracle10g Client

環境変数は
JAVA_HOME C:\jdk1.5.0_04
PATH(関係のありそうな所だけピックアップしました)
C:\jdk1.5.0_04\bin;C:\Oracle\product\10.1.0\Client_1\bin;
C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin\client;
C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin;

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-22 09:19
「コマンドプロンプトでテキストファイルをjavac→javaで実行」でも同じエラーがでるとのことですが、HelloWorld 程度も実行できないのでしょうか?

>java -cp jarファイル名 メインクラス
で実行できて、
>java -jar jarファイル名
で実行できないということでしたら MANIFEST.MF に Main-Class が適切に記述されていないのだと思います。
http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-22 09:39
インギさん、ご返答ありがとうございます。

HelloWorldも実行できない状態なのです。

例えば、ソースは、
package exec;
public class Exec {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
です。
JARファイル名 exec.jar
MANIFEST.MFには Main-Class: exec.Execと記述されています。
java exec で実行すると、
Exception in thread "main" java.lang.NoClassDefFoundError: exec
javaw exec で実行すると
Could not find the main class. Program will exit
と出ます。

これは、JARファイルではなく、テキストエディタで作って、javacでコンパイルしたclassファイルを実行する時も全く同じ現象が出ます。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-09-22 09:49
しんさん、こんにちは。
引用:
java exec


ではなくて、
引用:
java -jar exec.jar


ではどうでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-22 10:01
>java exec で実行すると、
>Exception in thread "main" java.lang.NoClassDefFoundError: exec
ですよね。同じエラーではないですよね。
これは
>java exec.Exec
とすべきではないでしょうか。

うまくいったら、当初説明したとおり
>java -cp jarファイル名 メインクラス

>java -jar jarファイル名
で切り分けをしてみましょう。
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-22 10:03
!!!!Hello Worldできました。
Kissingerさん、ありがとうございます!!

ところで、原因とかお伺いしても宜しいでしょうか。もしくは何か参照するものを教えて頂ければ、大変助かります。

あと、SWTアプリケーションを同じ形で実行すると、
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widge
ts/Composite
と出てしまいます。
javaw -jarで行うと、最初と同じエラーになってしまいます。
似たような原因なのでしょうか。
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-22 10:09
インギさん、すみません行き違いになってしまいました。

java exec.Exec と java -cp exec Exec
を実行しましたが、
Exception in thread "main" java.lang.NoClassDefFoundError: exec
と出てしまいます。

・・・すみません。差が良く分かっていないです。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-09-22 10:21
しんさん、
クラスを何処から読んでくるか、クラスローダ/Java VMの
立場になって考えると理解できるようになると思います。

java exec.Exec では、カレントディレクトリや環境変数で
指定されているクラスパスから、exec.Execを読み込もうと
します。クラスパスに Jarが指定されて居ない限りロード
出来ないでしょう。

java -cp exec Exec では、execディレクトリをクラスパス
として、無名パッケージのExecクラスを読み込もうとしま
す。多分、execディレクトリ直下の Exec.classを探して
しまうでしょう。

あと、java -jar exec.jar で swtの NoClassDefFoundError
になる件も、クラスパス上に swtのライブラリが見付からない
からです。
ライブラリのパスを -cp で指定するか、Manifestヘッダで
Class-Path: で指定する必要があります。
Oracle関連のクラスも同様に使用できるようにしなければ
なりません。

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