2017-02-18 6 views
0

よくある質問ですが、他のすべての回答を読んで解決策を見つけることができませんでした。私はJavaクラスパスを理解しようとしていますが、外部ライブラリを指定しようとするとError: Could not find or load main class Helloが実行されます。言われます。これは、コンパイルし、うまく動作しますJava:エラー:外部ライブラリをインポートしようとしたときにメインクラスHelloを見つけられないか読み込めませんでした

import java.util.*; 

public class Hello { 
    public static void main(String[] args) { 
     Date date = new Date(); 
     System.out.println("Hello world"); 
    } 
} 

...

[user ~]> ls -l 
Hello.java 
[user ~]> javac Hello.java 
[user ~]> ls -l 
Hello.java 
Hello.class 
[user ~]> java Hello 
Hello world 

...:

私は私のホームディレクトリに直接置かれ、この単純なプログラム、使用を開始

classpath環境変数が正しく設定されている(java.utilパッケージが見つかるため)。

私は-classpathにランダムなサードパーティのパッケージをインポートし、その場所を指定しようとすると、しかし、私はエラーを取得する:

[user ~]> cat Hello.java 
import java.util.*; 
import org.apache.commons.lang3.time.*; 

public class Hello { 
    public static void main(String[] args) { 
     StopWatch sw = new StopWatch(); 
     Date date = new Date(); 
     System.out.println("Hello world"); 
    } 
} 
[user ~]> ls .m2/repository/org/apache/commons/commons-lang3/3.3.1 
commons-lang3-3.3.1.jar 
[user ~]> javac -classpath ~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello.java 
[user ~]> java -classpath ~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello 
Error: Could not find or load main class Hello 

は、誰かが私に私がここで間違ってやってアイデアを与えるだろうか?

+0

明示的にクラスパスを定義していない場合、コンパイラは現在のフォルダを検索します。外部JARのクラスパスを定義したときに、コンパイラがどこにあるかを知らせることにしましたが、現在のディレクトリは無視されました。 –

答えて

1

最初に、java.utilクラスはJRE自体の一部であり、クラスパスが何であれ自動的に利用可能です。

最初の例は、クラスパスを指定していないため正常に動作し、デフォルトのパス(つまり、現在のディレクトリは.)が使用されます。

2番目の例ではクラスパスを指定していますが、.(現在のディレクトリ)は含まれていないため、実行時にcommons-langクラスを使用できますが、Helloクラスは使用できません。将来的にも

java -classpath .:~/.m2/repository/org/apache/commons/commons-lang3/3.3.1/commons-lang3-3.3.1.jar Hello 

を、使用してください:

  • は今まで、これまで
    • ルートを含む、実際のプロジェクト構造を作成
    • デフォルトのパッケージでクラスを入れていませんディレクトリ
    • パッケージ構造で正しく編成された.javaファイルを含むソースディレクトリ
    • classesディレクトリ、あなたは最初からすべてを再コンパイルするだけで明らかたいことができたときに、コンパイルされた.classファイルを含む

もちろん、ビルド・ツールとしてのGradleやMavenを使用するだろう次のステッププロジェクトの推奨レイアウトに従ってください。

+0

これは本当に残念ですが、クラスパスには常に現在のディレクトリが自動的に含まれると思いました。私は通常Mavenとその推奨されるプロジェクト構造を使用していますが、私はちょうどボンネットの下を見るための簡単な実験としてこれを設定しました。ご回答有難うございます。 – user8793

関連する問題