2017-08-11 3 views
0

Javaは、パッケージ名とソースコード のファイル構造との間に相関関係を必要としません。しかし、ほとんどのIDEでは、 パッケージ名の各部分にサブフォルダが必要です。対応していないフォルダ構造とパッケージ名を持つコマンドラインからjavaを実行する

上記の記述はtrueですか?

これを試すには、~/Tempフォルダにシンプルなクラスを作成しました。コマンドラインから次に

package com.gnrcs.lab; 

public class Main { 
    public static void main (String... args) { 
     System.out.println("Homo Sapiens"); 
    } 
} 

~$ cd ~/Temp/ 
~$ javac Main.java // it does produce a Main.class file in ~/Temp 
~$ java Main 
Error: Could not find or load main class Main 
~$ java com.gnrcs.lab.Main 
Error: Could not find or load main class com.gnrcs.lab.Main 
~$ java -cp . com.gnrcs.lab.Main 
Error: Could not find or load main class com.gnrcs.lab.Main 

私が間違って何をしたのですか?どんな助けもありがとうございます。ありがとう!

+0

@Robは、私もこの1を試してみました。結果を追加するために私の質問が更新されました。 – tausiq

+0

クラスパスに "。"その中に? javaには-cpオプションを使用します。例: "java -cp。com.gnrcs.lab.Main" – Dakoda

+0

@ダコダ私はそれを取得しません。このようなフォルダー構造体である 'com \ gnrcs \ lab'はありません。 '.java'ファイルと' .class'ファイルは同じフォルダ、 '〜/ Temp'にあります。 '-cp'オプションも試しました。 – tausiq

答えて

2

パッケージを使用した結果の1つは、クラスまたはインタフェースのバイトコードが、パッケージ名と一致するディレクトリ構造内になければならないということです。適切なディレクトリ構造にバイトコードを置かないと、コンパイラまたはJVMはクラスを見つけることができません。コンパイルされたバイトコードファイルは、パッケージ名と一致するファイルシステム上のディレクトリ構造内に現れなければなりません。たとえば、ファイルは、com.gnrcs.labパッケージ内の任意のクラスまたはインターフェイスに対して、\com\gnrcs\lab\に一致するディレクトリ構造内に存在する必要があります。このディレクトリ構造を自分で作成するか、コンパイル中に-dフラグを使用すると、コンパイラは必要なディレクトリ構造を作成し、そのディレクトリにバイトコードを配置します。

javaの実行中に-classpathフラグを追加する必要があります。 例:Tempディレクトリにいる場合は、java -classpath .\ com.gnrcs.lab.Mainを使用できます。

  1. javac -d .\ Main.java:簡単に言えば

    は、次の手順を実行します。これにより、パッケージ名に従ってディレクトリが作成され、そのディレクトリにバイトコードが配置されます。あなたの場合、~/Temp/com/gnrcs/lab/Main.class

  2. java -classpath .\ com.gnrcs.lab.Main。ここに完全修飾名を付ける必要があります。 -classpathのショートカットとして-cpフラグを使用することもできます。

(注:Linuxマシンのために即興)

+0

'.'のクラスパスを指定する必要はありません(env var CLASSPATHが別のものに設定されていない限り)。そうでなければ同意する。 –

関連する問題