解决Eclipse中运行WordCount出现 java.lang.ClassNotFoundException: org.apache.hadoop.examples.WordCount$Token

本文详细介绍了如何在examples包中创建EJob类,通过使用Jar文件来封装并加载类路径,同时在WordCount的主方法中整合了此功能,实现了将WordCount任务部署到Hadoop集群上的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载至:这里

在examples包中建立EJob类:

package org.apache.hadoop.examples;

 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;

 public class EJob {

     // To declare global field
     private static List<URL> classPath = new ArrayList<URL>();

     // To declare method
     public static File createTempJar(String root) throws IOException {
         if (!new File(root).exists()) {
             return null;
         }
         Manifest manifest = new Manifest();
         manifest.getMainAttributes().putValue("Manifest-Version", "1.0");
         final File jarFile = File.createTempFile("EJob-", ".jar", new File(
                 System.getProperty("java.io.tmpdir")));

         Runtime.getRuntime().addShutdownHook(new Thread() {
             public void run() {
                 jarFile.delete();
             }
         });

         JarOutputStream out = new JarOutputStream(
                 new FileOutputStream(jarFile), manifest);
         createTempJarInner(out, new File(root), "");
         out.flush();
         out.close();
         return jarFile;
     }

     private static void createTempJarInner(JarOutputStream out, File f,
             String base) throws IOException {
         if (f.isDirectory()) {
             File[] fl = f.listFiles();
             if (base.length() > 0) {
                 base = base + "/";
             }
             for (int i = 0; i < fl.length; i++) {
                 createTempJarInner(out, fl[i], base + fl[i].getName());
             }
         } else {
             out.putNextEntry(new JarEntry(base));
             FileInputStream in = new FileInputStream(f);
             byte[] buffer = new byte[1024];
             int n = in.read(buffer);
             while (n != -1) {
                 out.write(buffer, 0, n);
                 n = in.read(buffer);
             }
             in.close();
         }
     }

     public static ClassLoader getClassLoader() {
         ClassLoader parent = Thread.currentThread().getContextClassLoader();
         if (parent == null) {
             parent = EJob.class.getClassLoader();
         }
         if (parent == null) {
             parent = ClassLoader.getSystemClassLoader();
         }
         return new URLClassLoader(classPath.toArray(new URL[0]), parent);
     }

     public static void addClasspath(String component) {

         if ((component != null) && (component.length() > 0)) {
             try {
                 File f = new File(component);

                 if (f.exists()) {
                     URL key = f.getCanonicalFile().toURL();
                     if (!classPath.contains(key)) {
                         classPath.add(key);
                     }
                 }
             } catch (IOException e) {
             }
         }
     }

 }

接着在WordCount的Main方法中加入如下代码:

File jarFile = EJob.createTempJar("bin");

EJob.addClasspath("/usr/hadoop/conf");

ClassLoader classLoader = EJob.getClassLoader();

Thread.currentThread().setContextClassLoader(classLoader);

。。。

((JobConf) job.getConfiguration()).setJar(jarFile.toString()); 

再次运行Run on hadoop即可得到结果

<think>嗯,我现在遇到了IntelliJ IDEA中运行Java程序时出现的“找不到或无法加载主类”的错误,具体是java.lang.ClassNotFoundException。这个问题看起来有点棘手,但让我慢慢理清楚可能的原因和解决办法。 首先,我需要理解这个错误的含义。根据引用[2]和[3],这个异常通常发生在JVM尝试加载某个类但找不到的时候。主类找不到可能是因为编译后的.class文件不存在,或者类路径配置不正确。 接下来,我应该检查项目的主类配置是否正确。引用[4]提到,当用户删除了原来的主类并新建了一个主类后,出现了这个问题,解决方法是确保运行配置中的主类名正确。所以,我需要检查IDEA的运行配置,确认主类的全限定名是否正确,没有拼写错误,并且确实存在于项目中。 然后,考虑类路径的问题。有时候,项目的输出路径可能没有正确设置,导致生成的.class文件不在预期的目录下。在IDEA中,可以通过检查项目的“Project Structure”设置,查看编译输出路径是否正确。引用[5]提到了路径问题,虽然那个是关于Hadoop的UnsatisfiedLinkError,但路径配置的重要性是相似的。可能需要重新配置模块的输出路径,或者执行“Rebuild Project”来确保所有类都被正确编译。 另外,依赖管理也是一个可能的原因。如果项目使用了Maven或Gradle,可能存在依赖未正确加载的情况。这时候,可以尝试更新依赖,重新导入项目,或者清理缓存。比如,在Maven项目中执行“mvn clean install”来重新构建。 还有,缓存问题有时候会导致类找不到。IDEA的缓存可能有问题,这时候可以尝试“File -> Invalidate Caches / Restart”来清除缓存并重启IDE,看看问题是否解决。 如果上述步骤都无效,可能需要检查项目的SDK配置是否正确,确保项目使用的是正确的JDK版本,并且没有损坏的SDK安装。有时候,JDK路径错误或版本不兼容也会导致类加载失败。 最后,如果问题仍然存在,可以尝试手动编译和运行程序,使用命令行工具进入项目目录,执行javac和java命令,看看是否出现同样的错误。这有助于确定是IDEA的配置问题还是项目本身的代码问题。 总结一下,可能的解决步骤包括检查运行配置、类路径、依赖管理、清理缓存、验证SDK配置以及手动编译运行。需要逐一排查这些可能性,直到找到具体的原因并解决。</think>### 解决IntelliJ IDEA中“找不到或无法加载主类”错误(ClassNotFoundException)的步骤 #### 1. **检查主类配置** - **确认主类名称正确**:在运行配置中检查主类的全限定名(如`com.example.WordCount`),确保与项目中实际类名一致[^4]。 - **检查类是否编译**:确认主类已成功编译生成`.class`文件,路径通常为`out/production/<项目名>/`。 #### 2. **清理并重新构建项目** - 执行以下操作: ```bash Build -> Rebuild Project ``` - 若使用Maven/Gradle,运行`mvn clean install`或`gradle clean build`[^3]。 #### 3. **检查模块依赖和类路径** - **确认模块依赖**:在`File -> Project Structure -> Modules`中,确保主类所在模块被正确添加且依赖无冲突。 - **检查输出路径**:在`Project Structure -> Project -> Project Compiler Output`中,确保路径指向正确的编译目录(如`out/production`)。 #### 4. **处理缓存问题** - 清理IDEA缓存: ```bash File -> Invalidate Caches / Restart -> Invalidate and Restart ``` #### 5. **验证SDK配置** - 在`File -> Project Structure -> Project SDK`中,确认使用的JDK版本与项目兼容,且路径有效。 #### 6. **手动编译与运行(辅助排查)** - 通过命令行定位到源码目录,执行: ```bash javac -d ./out src/main/java/com/example/WordCount.java java -cp ./out com.example.WordCount ``` - 若手动运行成功,则问题可能源于IDEA配置;否则需检查代码或环境。 #### 7. **特殊场景:Hadoop/MapReduce项目** - 若涉及Hadoop(如`WordCount`示例),需确保: - 依赖包完整(如`hadoop-common`、`hadoop-mapreduce-client-core`)[^1]。 - 资源文件路径正确,避免使用通配符`*`导致路径解析失败[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值