我在 java 中运行以下程序时遇到问题(我是 java 的初学者)。这里的程序使用 HDFS 特定的 URLstreamhandlerfactory 来使用适当的协议(protocol)处理程序来访问 HDFS。在 eclipse 中,它没有显示任何错误。我已将 hadoop-common-2.2.0.jar 放在构建路径中。
package org.hdfs.prog;
//cc URLCat Displays files from a Hadoop filesystem on standard output using a //URLStreamHandler
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
public class URLCat {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws Exception {
InputStream in = null;
try {
in = new URL(args[0]).openStream();
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
但是当我运行它时,出现类未找到错误,如下所示。
好吧,这清楚地表明它在运行时没有找到一个类“org.apache.commons.logging.LogFactory”。为了克服这个问题,我下载了包含“org.apache.commons.logging”包的 jar 文件。然后我再次运行代码,另一个类未找到错误。
是否有任何解决方案可以提前告诉我需要哪些运行时依赖 jar 文件?请帮帮我。
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.apache.hadoop.conf.Configuration.<clinit>(Configuration.java:165)
at org.apache.hadoop.fs.FsUrlStreamHandlerFactory.<init>(FsUrlStreamHandlerFactory.java:54)
at org.hdfs.prog.URLCat.<clinit>(URLCat.java:14)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 3 more
Could not find the main class: org.hdfs.prog.URLCat. Program will exit.
最佳答案
我建议你使用像 Maven 这样的构建工具。当您在 pom.xml 中指定 hadoop Artifact 时,将下载其所有直接和间接依赖项。 Hadoop 有很多依赖项,一个一个地下载所有 jar 非常耗时。
您只需将 maven 依赖项添加到您的 pom.xml,所有其他依赖项将自动下载:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>0.20.2</version>
</dependency>
关于java - 无法使用 URL 协议(protocol)处理程序从 HDFS 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19961503/