2017-03-04 13 views
0

私はMyTestというプロジェクトを持っています。これは3つのクラスがあります。実行可能なJARファイル: "org.apache.hadoop.util.Tool"を実装するクラスが見つかりません

ファーストクラスは私が空の実装をした単純化のためのツールのインタフェース(これが問題を引き起こしているクラスである)を実装します。

import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.util.Tool; 

public class A1 extends Configured implements Tool{ 

    public static void main(String[] args) throws Exception { 

     System.out.println("Hello A1"); 
    } 

    @Override 
    public int run(String[] args) throws Exception { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

} 

第二のクラスは通常のクラスであります:

public class A2 { 

    public static void main(String[] args) throws Exception { 

     System.out.println("Hello A2"); 
    } 


} 

第三のクラスは、通常のクラスである:

public class A3 { 

    public static void main(String[] args) throws Exception { 

     System.out.println("Hello A3"); 
    } 


} 

私はプロジェクトを「Runnable Jar」としてエクスポートしました。 Eclipseの場合:プロジェクト>>エクスポート>>実行可能なJARファイル)。

私は今、「起動設定」でメインクラスとして「A2」に設定し、「生成されたJARにパッケージ化に必要なライブラリ」と出力JARまたは「エクスポート先」の名前が「MyTest.jar」である

私は、コマンドを実行した場合、予想通り:

java -jar MyTest.jar 

は、それが印刷されます:

Hello A2 

私はコマンドを実行する場合:

java -cp MyTest.jar A2 

それが印刷されます:

Hello A2 

を、私はコマンドを実行している場合:

java -cp MyTest.jar A3 

をそれを印刷します:

Hello A3 

を私が実行している場合さて、問題は、ありますコマンド:

java -cp MyTest.jar A1 

私はこのエラーを与える:

Error: Could not find or load main class A1 

私はそれを何度も試み、異なるシナリオで問題は同じである:クラスは「org.apache.hadoop.util.Tool」インタフェースを実装したときにそのクラスは見つからないでしょう。

に注意してください:私は「A1」に「起動設定」でjarファイルのメインクラスを設定した場合、コマンド「MyTest.jar -jar javaのは、」「こんにちはA1」を正しく実行していますされますが、コマンド "java -cp MyTest.jar A1"は依然として "A1"を見つけることができません。

なぜこのようなことが起こり、 "java -cp MyTest.jar A1"コマンドで "A1"を見つけることができますか?

UPDATE:

私は、必要なjarファイルを指定することで、問題を解決するために、今できる午前:

java -cp MyTest.jar:"/home/mosab/workspace/Hadoop Jars/Binaries/hadoop-common-2.7.3.jar" A1 

そして、あなたはjarファイルの束を持っている場合は、「RunnableをJARファイルをエクスポートすることができます[コピーに必要な次の生成されたJARにサブフォルダにライブラリ 『オプションと"と』:

java -cp MyTest.jar:./MyTest_lib/* A1 

お知らせ: MyTest_libは、すべてのjarファイルに

を含むフォルダのときに、Javaオプション、引数、またはパッケージ名を渡す場合:

java -Xms2048m -Option2 -cp MyTest.jar:./MyTest_lib/* PackageName.A1 Arg1 Arg2 

答えて

0

A1は、あなたがすべてを含める必要が動作するようにjarは-cpで参照されるクラスを含んでいます。おそらくA1をコンパイルするのに使ったjarのリストと同じです。 Windowsでは、リストは ';'で区切られています。 Linuxでは、リストは ':'で区切られています。 エラーは、A1が参照するクラスファイルが見つからないためです。したがって、A1をロードできません。私は含まれるべきであるのjarファイルここで問題にすぎない作品返信用

java -cp MyTest.jar;Hadoop.jar;Hadoop2.jar A1 
+0

おかげで、:一般的な例としてHadoop.jarとHadoop2.jarを使用して

?私のプロジェクトでは、いくつかのクラスを使用するメインクラスがjarファイルに存在し、これらのクラスは他のjarファイルなどのクラスを使用しています。したがって、すべてのjarファイル、つまり依存するjarファイルや扶養プログラムの依存ファイルなどを含めることにします。jarファイルの巨大なリストがあります。 –

+0

注意:必要なすべてのjarファイルは既にRunnable Jarファイルに入っていますので、どうすれば簡単に使用できますか?また、 "launch configuration"で指定されたメインクラスは、必要なjarがすでにMANIFEST.MFに記述されていると思うので、 "java -jar MyTest.jar"という依存関係/ jarを指定する必要はありません。 MFファイルを使用して、 "java"コマンドにメインクラスのjarを含めるよう指示します。 –

+0

私はあなたの最善の策は、メインクラスとしてA1を持つjarファイルを再作成し、java -jar MyTest.jarを使用することだと思います。 Runnable Jar Fileを作成すると、1つのクラスがMain-Classとして識別されました。これはMETA-INF/MANIFEST.MFのjarファイルの中で見ることができます。これは、 "java -jar"を使用するときにどのクラスがメインクラスであるかをjavaがどのように知っているかを示します。 – ProgrammersBlock

関連する問題