2013-09-24 115 views
0

我有一個測試目錄,其中包含3個文件夾:無法運行,因爲的jar文件「無法找到或加載主類」

--META-INF: 
    one file MANIFEST.MF in the dir: 
    MANIFEST.MF: 
     anifest-Version: 1.0 
     Created-By: 1.7.0_04-ea (Oracle Corporation) 
     Class-Path: lib/*; . 
     Main-Class: Setup.WordCount 
-- lib: 
    all the external jars I need for the project 
-- Setup: 
    3 files in the dir: 
    WordCount$IntSumReducer.clas 
    WordCount$TokenizerMapper.class 
    WordCount.class 

我用命令

jar cmf test.jar test/META-INF/MANIFEST.MF test/Setup test/lib 
創建一個JAR文件

但是當我嘗試運行test.jar,錯誤報告:

Error: Could not find or load main class Setup.WordCount 

我試圖調試整個一天的概率,仍然不知道!

WordCount.java

package Setup; 

import java.io.IOException; 
import java.util.StringTokenizer; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.util.GenericOptionsParser; 

public class WordCount { 

    public static class TokenizerMapper 
     extends Mapper<Object, Text, Text, IntWritable>{ 

    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

    public void map(Object key, Text value, Context context 
        ) throws IOException, InterruptedException { 
     StringTokenizer itr = new StringTokenizer(value.toString()); 
     while (itr.hasMoreTokens()) { 
     word.set(itr.nextToken()); 
     context.write(word, one); 
     } 
    } 
    } 

    public static class IntSumReducer 
     extends Reducer<Text,IntWritable,Text,IntWritable> { 
    private IntWritable result = new IntWritable(); 

    public void reduce(Text key, Iterable<IntWritable> values, 
         Context context 
         ) throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
     sum += val.get(); 
     } 
     result.set(sum); 
     context.write(key, result); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
    if (otherArgs.length != 2) { 
     System.err.println("Usage: wordcount <in> <out>"); 
     System.exit(2); 
    } 
    Job job = new Job(conf, "word count"); 
    job.setJarByClass(WordCount.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    FileInputFormat.addInputPath(job, new Path(otherArgs[0])); 
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
    } 
} 

的代碼是完全一樣hadoop/example/WordCount,我想在我的本地開發環境中實現Hadoop的例子。

+0

嘗試使用此命令創建jar cmf test/META-INF/MANIFEST.MF test.jar test/Setup/*。class test/lib/*由於Manifest文件和瓶名問題 – Ragavan

+0

@Ragavan,我試過你的建議,仍然是同樣的錯誤。 – user1453951

回答

0

你的jar語句有些偏離。試試這個:

jar -cfm test.jar test/META-INF/MANIFEST.MF -C test Setup -C test lib 

你的命令將測試/設置/ WordCount.class在罐子裏,這就是爲什麼Java的找不到安裝/ WordCount.class

您還缺少在代碼中的包語句時貼:

package Setup; 
+0

謝謝!我認爲這是因爲第一點,現在它在我將命令修改爲您的版本後起作用。 :)(ps,當我在這裏複製代碼時,我錯過了「程序包安裝程序」......但是我確實在我的文件中有。) – user1453951

0

在代碼中指定包 - 和比在啓動命令中使用它/ 例如:

hadoop jar mywordcount.jar hadoop.mytest.WordCount input22/input /home/training/output 

其中hadoop.mytest.WordCount - 是你的包

相關問題