首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala NoClassDefFoundError

Scala NoClassDefFoundError
EN

Stack Overflow用户
提问于 2016-01-19 09:49:19
回答 1查看 2.2K关注 0票数 0

我是斯卡拉的新手。我有这样的代码:

代码语言:javascript
复制
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{Path, FileSystem}

/**
 * Created by serban on 19/01/16.
 */
object TestHadoop {
 def main(args: Array[String]):Unit = {


   val namenodeEndpoint = "hdfs://123.45.123.45:8020"
   val conf = new Configuration
   conf.set("fs.defaultFS", namenodeEndpoint)

   val fs = FileSystem.newInstance(conf)

   val path = new Path("/user/ubuntu")

   val fileStatus = fs.listFiles(path,false)

   println("Hello world "+fileStatus.getClass)

   while(fileStatus.hasNext())
     {
       println("FS: "+fileStatus.next())
     }


 }
}

当我从Maven运行它时,它运行正常。但是我将编译后的类移到另一台机器上,并通过scala TestHadoop在命令行中运行它。我得到的是:

代码语言:javascript
复制
java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
    at TestHadoop$.main(TestHadoop.scala:13)
    at TestHadoop.main(TestHadoop.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:78)
    at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:24)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:88)
    at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:78)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
    at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
    at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
    at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:56)
    at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$findClass(ScalaClassLoader.scala:88)
    at scala.tools.nsc.util.ScalaClassLoader$class.findClass(ScalaClassLoader.scala:44)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.findClass(ScalaClassLoader.scala:88)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$loadClass(ScalaClassLoader.scala:88)
    at scala.tools.nsc.util.ScalaClassLoader$class.loadClass(ScalaClassLoader.scala:50)
    at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.loadClass(ScalaClassLoader.scala:88)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

我的第一次进口有问题。当我在Maven中运行它时,Maven知道如何解决这个依赖。

问题:如何从命令行在我的计算机上运行这个示例?

谢谢。

你好,塞尔班

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-19 10:17:41

您有一个NoClassDefFoundError错误,因为您只是调用类而没有将所需的外部库传递给Scala。Maven已经有任何定义的依赖项作为其类路径的一部分,因此在运行时检测到外部库。

您需要使用Scala的-cp选项,并将所需的jar文件(外部库)传递给它,尽管这种方法可能容易出错,并且无法维护大量的依赖项。

或者,您可以在pom中添加以下内容:

代码语言:javascript
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.2</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <finalName>${artifactId}-${version}-with-dependencies</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

注意:如果已经配置了插件,只需添加Maven Shade插件的插件元素即可。

此配置将使用artifactId和版本创建一个far jar,并将其作为-with-dependencies令牌的后缀添加。只管跑:

代码语言:javascript
复制
mvn package

您将在目标文件夹中找到新的jar。

然后,您可以在另一台机器中使用这个jar (而不仅仅是编译的文件),并按如下方式运行它:

代码语言:javascript
复制
scala -cp yourproject-yourversion-with-dependencies.jar TestHadoop
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34873444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档