Javaアプリケーションの実行中に問題が発生しました。コマンドを使用してプログラムを実行しようとするたびに
Java ProgAudioJ
私はこのエラーを受け取ります:
Exception in thread "main"
Java.lang.NoClassDefFoundError: ProgAudioJ (wrong name: es_2011/ProgAudioJ)
at Java.lang.ClassLoader.defineClass1(NativeMethod)
at Java.lang.ClassLoader.defineClassCond(ClassLoader.Java:632)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:616)
at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:141)
at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:283)
at Java.net.URLClassLoader.access$000(URLClassLoader.Java:58)
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:197)
at Java.security.AccessController.doPrivileged(NativeMethod)
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: ProgAudioJ. Program will exit.
コードから削除した場合:
package es_2011;
すべてが完璧に動作します。どうすれば問題を解決できますか?
これらの答えが不明確であることがわかったので、ここにあなたがする必要があるものがあります。最初に、コードをパッケージ化する場合(つまり、クラスの先頭にpackage
キーワードがあります)、コンパイルされたクラスは、コード内のパッケージ宣言と同じ名前のディレクトリにある必要があります。クラスをコンパイルしたら、Javaコマンドを削除するときにディレクトリを上に移動し、パッケージの名前を含めるです。たとえば、コードが/myFolder/myPackage/
に存在し、クラスがpackage myPackage
で始まる場合(ディレクトリとパッケージは同じ名前であることに注意してください)、次のようにします(linux/osx):
cd /myFolder/myPackage
javac MyClass.Java
cd ..
Java myPackage.MyClass
編集-人々が混乱していると私が見る何かを明確にするための遅い編集。上記の例では、パッケージの深さは1つだけで、myPackageだけです。コードに次のような大きなパッケージがある場合
package com.somedomain.someproject;
そのパッケージのルートディレクトリを含むディレクトリからJavaコマンドを実行する必要があります。たとえば、コンパイルされたコードがmyCode/com/somedomain/someproject/MyMainClass.classにある場合、次のように、JavaコマンドをmyCodeフォルダから実行します(ここでも、ディレクトリ構造はパッケージ宣言と同じであることに注意してください)。
cd /myCode
Java com.somedomain.someproject.MyMainClass
使ってみてください:
Java es_2011.ProgAudioJ
(の代わりに Java ProgAudioJ
)。
ここでは、現在の作業ディレクトリとCLASSPATHについていくつか想定しています。実行中のコマンドに関する情報(たとえば、現在使用しているディレクトリ、クラスファイルの場所など)を提供できる場合は、より効率的に支援できます。
これを試してください(コンパイルして実行してください):
dir
2011-02-10 00:30 <DIR> .
2011-02-10 00:30 <DIR> ..
2011-02-10 00:27 58 es_2011
javac es_2011/ProgAudioJ
Java es_2011.ProgAudioJ
そこでは非常に明確に述べられています:
Java.lang.NoClassDefFoundError:ProgAudioJ(間違った名前:es_2011/ProgAudioJ)
クラスをパッケージ(*)に配置する場合は、ソースコードを対応するディレクトリに配置する必要があります。たとえば、
src/Main.Java <- root package (no declaration)
src/es_2011/ProgAudioJ.Java <- package es_2011;
(*)小さな使い捨てのものと、おそらくメインクラスを除いて、あなたは常にそれをするべきです。
これを試して、
以下のコマンドを使用してクラスをコンパイルします
$ javac ProgAudioJ.Java -d .
コマンドでアプリケーションを実行する
$ Java es_2011.ProgAudioJ
取り外したときに機能する理由package es_2011
は、コンパイラがファイルをパッケージ化する方法、およびファイルを効果的に見つける方法を変更することです。
私は同じ問題を抱えていました-そしてエラーメッセージwrong name:
は確かにその答えを示しています。 .classファイルを実行するために、間違った名前「ProgAudioJ」を使用しています。としてパッケージ化されています
es_2011/ProgAudioJ
それを実行するには、ディレクトリを上に移動する必要があります。
ここにいる場合:(Windows) src\es_2011\
へ引っ越す src\
次に、次の行を実行します。
Java es_2011.ProgAudioJ
これは、es_2011パッケージにあるProgAudioJを探すようコンパイラーに指示します。標準インストールの場合、これはフォルダーに基づくため、最初にes_2011フォルダーが検索され、次に実行する.classファイル(ProgAudio)の名前が検索されます。