0

私はJavaスイングコードを持っています.5つのクラスがあり、メインクラスは他の4つのクラスを参照しています.ここではいくつかのjarも追加しました.

C:\Users\FSSD\Desktop\FinalAttempt\install\lib>javac WriteHelper.java JavaDemo.j
ava DataBaseHelper.java FileEncryption.java SendEmail.java -cp dnsns.jar;dsn.jar
;imap.jar;javaws.jar;jce.jar;jsse.jar;jxl-2.6.jar;localedata.jar;mail.jar;mailap
i.jar;pop3.jar;rt.jar;smtp.jar;sqlitejdbc-v056.jar;sunjce_provider.jar;sunmscapi
.jar;sunpkcs11.jar;tools.jar JavaSamp.java

ここでメインクラスを保持するJavaSampは、他のクラスはWriteHelper、JavaDemo、DataBaseHelper、fileEncription、およびSendEmailクラスです。上記のcmdを使用してコンパイルすると、正常にコンパイルされ、このクラスを実行すると、次の例外が発生します

C:\Users\FSSD\Desktop\FinalAttempt\install\lib>java WriteHelper.java JavaDemo.ja
va DataBaseHelper.java FileEncryption.java SendEmail.java -cp dnsns.jar;dsn.jar;
imap.jar;javaws.jar;jce.jar;jsse.jar;jxl-2.6.jar;localedata.jar;mail.jar;mailapi
.jar;pop3.jar;rt.jar;smtp.jar;sqlitejdbc-v056.jar;sunjce_provider.jar;sunmscapi.
jar;sunpkcs11.jar;tools.jar JavaSamp
Exception in thread "main" java.lang.NoClassDefFoundError: WriteHelper/java
Caused by: java.lang.ClassNotFoundException: WriteHelper.java
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: WriteHelper.java.  Program will exit.

どうすれば克服できますか、よろしくお願いします...

4

4 に答える 4

3

ソースコードを伝えて Java クラスを実行するわけではありません。実行するクラスを指定します。例えば:

java -cp .;dnsns.jar;...[... as before ...] com.foo.JavaSamp

JavaSampのパッケージで呼び出されるクラスを想定していますcom.foo-d .コンパイル時に、ソース ファイル内のパッケージ名に基づいて、現在のディレクトリをルートとするフォルダー構造にクラス ファイルを配置するように指示するようなものを使用する必要があることに注意してください。

于 2011-06-21T09:31:49.467 に答える
0

Java ファイルを実行するには、どのクラス ファイル(拡張子で終わりますが.class、拡張子は指定しません) を指定し、残りのクラスとライブラリ (.jar拡張子付き) はクラスパスで提供されます。

例えば

java WriteHelper -classpath "<directory_where_class_file_exists>;mail.jar/localedata.jar;

ファイルをコンパイルするには、javac代わりに使用します。あなたがしたことは、JavajavaWriteHelperディレクトリ(またはパッケージ)を探すように指示したことです。

于 2011-06-21T09:31:41.280 に答える
0

実行java WriteHelper.java すると、「WriteHelper」パッケージで「java」というクラスを探すように Java に指示されます。そこにはありません。それは、例外が次のように言っているときにあなたに伝えていることです:

スレッド「メイン」での例外 java.lang.NoClassDefFoundError: WriteHelper/java

としてクラスを実行しますjava WriteHelper。このjavaコマンドは、クラス ファイル名ではなく、クラス名を必要とします。


コードをコンパイルして実行する方法には、他にも問題があります。

  • -cpオプションとその値は、Java ソース ファイルの名前 ( の場合) および Java クラスの名前 ( の場合) の前に表示する必要がありjavacますjava

  • このjavaコマンドは、多数のクラス名ではなく、1 つのクラス名を想定しています。どのクラスがpublic static void main(String[] args)メソッドを持つクラスであるかを把握し、そのクラス (のみ) をjavaクラス引数として使用する必要があります。(エントリポイントメソッドMainを持つというクラスがあると思います。)main

  • これは、クラスがすべてデフォルト クラスで宣言されている場合にのみ機能します。ソース コードが宣言で始まる場合、packageコンポーネントがクラス パッケージを反映するディレクトリ ツリーでクラスを整理する必要があります。@Jon Skeetの回答を参照してください。

java最後に、およびのマニュアル ページとjavac、クラスパスがどのように機能するかについて説明しているリンク先のページを注意深く読むことをお勧めします。それらを理解すると、これはもはや黒魔術のようには見えなくなります。

于 2011-06-21T09:32:57.057 に答える
0

最初のステップで生成されたクラスを、2 番目のステップのクラスパスに含める必要があります。

于 2011-06-21T09:33:10.363 に答える