web-dev-qa-db-ja.com

Java .classファイルを実行するにはどうすればよいですか?

HelloWorldプログラムをコンパイルしました。コマンドPromptを使用して実行しています。 .classファイルの名前はHelloWorld2.classです

ファイルはC:\ Users\Matt\workspace\HelloWorld2\binにあります。コマンドプロンプトに移動して「Java HelloWorld2」と入力すると、次のようになります。

C:\Users\Matt>Java HelloWorld2
Exception in thread "main" Java.lang.NoClassDefFoundError: HelloWorld2
Caused by: Java.lang.ClassNotFoundException: HelloWorld2
        at Java.net.URLClassLoader$1.run(Unknown Source)
        at Java.security.AccessController.doPrivileged(Native Method)
        at Java.net.URLClassLoader.findClass(Unknown Source)
        at Java.lang.ClassLoader.loadClass(Unknown Source)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at Java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: HelloWorld2.  Program will exit.

HelloWorldが印刷されるのを期待していました。私は何を間違えていますか? JDKがインストールされています。

61
Skizz

コンパイル済みクラスを見つけるために、クラスパスを設定する必要があります。

Java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2

81
Isaac Truett

コマンドラインから Javaクラスファイル を実行するための構文は次のとおりです。

Java -classpath /path/to/jars <packageName>.<MainClassName>

packageName(通常はcomまたはorgで始まります)は、クラスファイルが存在するフォルダー名です。

たとえば、メインクラス名がAppで、アプリの Javaパッケージ名com.foo.appである場合、クラスファイルはcom/foo/appフォルダー(各ドットの個別フォルダー)にある必要があります)、アプリを次のように実行します:

$ Java com.foo.app.App

注:$はシェルプロンプトを示しています。入力時には無視してください

クラスにpackage名が定義されていない場合は、単にJava Appとして実行します。

他のjar依存関係がある場合は、-cp/-classpathを使用するか、使用して classpath パラメーターを指定したことを確認してください。 CLASSPATHあなたのjar/war/ear/Zip/classファイル。そのため、Linuxではコマンドの前にCLASSPATH=/path/to/jarsを付けることができ、Windowsではフォルダーをシステム変数に追加する必要があります。設定されていない場合、ユーザークラスパスは現在のディレクトリ(.)で構成されます。


実用例

Maven を使用してサンプルプロジェクトを作成した場合:

$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 

そして、mvn compileディレクトリでmy-app/によってプロジェクトをコンパイルすると、target/classes/com/foo/app/App.classにあるクラスファイルが生成されます。

実行するには、-cpを介してクラスパスを指定するか、直接アクセスして、以下の例を確認します。

$ find . -name "*.class"
./target/classes/com/foo/app/App.class
$ CLASSPATH=target/classes/ Java com.foo.app.App
Hello World!
$ Java -cp target/classes com.foo.app.App
Hello World!
$ Java -classpath .:/path/to/other-jars:target/classes com.foo.app.App
Hello World!
$ cd target/classes && Java com.foo.app.App
Hello World!

クラス名とパッケージ名を再確認するには、Javaクラスファイル逆アセンブラツールを使用できます。例:

$ javap target/classes/com/foo/app/App.class
Compiled from "App.Java"
public class com.foo.app.App {
  public com.foo.app.App();
  public static void main(Java.lang.String[]);
}

注:コンパイルされたファイルが難読化されている場合、javapは機能しません。

32
kenorb

これは多くのことを意味しますが、最も一般的なのは、ファイルに含まれるクラスがファイル自体と同じ名前を持っていないことです。クラスがHelloWorld2とも呼ばれるかどうかを確認してください。

2
Federico Vera