20

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;

すべてが完璧に機能します。問題を解決するにはどうすればよいですか?

4

6 に答える 6

53

これらの答えが不明確であることがわかったので、ここであなたがしなければならないことがあります。まず、コードをパッケージ化する場合 (つまり、クラス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 にある場合、次のように myCode フォルダーから java コマンドを実行します (ここでも、ディレクトリ構造がパッケージと同じであることに特に注意してください。宣言):

cd /myCode
java com.somedomain.someproject.MyMainClass
于 2012-08-20T20:34:49.390 に答える
2

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

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

于 2011-02-09T23:34:01.453 に答える
2

使用してみてください:

java es_2011.ProgAudioJ

(代わりにjava ProgAudioJ)。

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

于 2011-02-09T23:32:21.603 に答える
1

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

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

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

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

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

于 2011-02-09T23:35:55.177 に答える
0

削除したときに機能する理由
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)を検索します。

于 2012-08-22T11:44:53.353 に答える
0

これを試して、

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

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

    $ java es_2011.ProgAudioJ
    
于 2013-05-03T18:43:54.733 に答える