web-dev-qa-db-ja.com

コマンドラインからJavaプログラムを実行するときに「間違った名前」NoClassDefFoundErrorを受け取る

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;

すべてが完璧に動作します。どうすれば問題を解決できますか?

18
MAX

これらの答えが不明確であることがわかったので、ここにあなたがする必要があるものがあります。最初に、コードをパッケージ化する場合(つまり、クラスの先頭に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
46
Mark W

使ってみてください:

Java es_2011.ProgAudioJ

(の代わりに Java ProgAudioJ)。

ここでは、現在の作業ディレクトリとCLASSPATHについていくつか想定しています。実行中のコマンドに関する情報(たとえば、現在使用しているディレクトリ、クラスファイルの場所など)を提供できる場合は、より効率的に支援できます。

2
Rob Hruska

これを試してください(コンパイルして実行してください):

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

2
lukastymo

そこでは非常に明確に述べられています:

Java.lang.NoClassDefFoundError:ProgAudioJ(間違った名前:es_2011/ProgAudioJ)

クラスをパッケージ(*)に配置する場合は、ソースコードを対応するディレクトリに配置する必要があります。たとえば、

src/Main.Java <- root package (no declaration)
src/es_2011/ProgAudioJ.Java <- package es_2011;

(*)小さな使い捨てのものと、おそらくメインクラスを除いて、あなたは常にそれをするべきです。

1
maaartinus

これを試して、

  1. 以下のコマンドを使用してクラスをコンパイルします

    $ javac ProgAudioJ.Java -d .
    
  2. コマンドでアプリケーションを実行する

    $ Java es_2011.ProgAudioJ
    
0
Amar

取り外したときに機能する理由
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)の名前が検索されます。

0
declanh