【问题标题】:NoClassDefFoundError using mahoutNoClassDefFoundError 使用 mahout
【发布时间】:2012-11-08 15:06:54
【问题描述】:

我开始学习 mahout,但在第一步中,我的程序中出现了一个奇怪的错误。 我正在尝试用几行代码构建一个简单的推荐器:

import java.util.List;
import java.io.File;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
/**
 */
public class RecommenderIntro {
    public static void main(String[] args) throws Exception {
        // TODO code application logic here
        DataModel model =
                new FileDataModel (new File("intro.csv"));
        UserSimilarity similarity =
                new PearsonCorrelationSimilarity (model);
        UserNeighborhood neighborhood =
                new NearestNUserNeighborhood (2, similarity, model);
        Recommender recommender = new GenericUserBasedRecommender (
                model, neighborhood, similarity);
        List<RecommendedItem> recommendations =
                recommender.recommend(1, 1);
        for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
        }
    }
}

但我收到此错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<clinit>(FileDataModel.java:119)
    at recommenderintro.RecommenderIntro.main(RecommenderIntro.java:28)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    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)
    ... 2 more
Java Result: 1

这段代码有什么问题?我是从书中复制的!


但是使用所有这些 jar 文件我得到以下错误:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/omid/Desktop/slf4j-1.7.2/slf4j-jcl-1.7.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/omid/Desktop/slf4j-1.7.2/slf4j-jdk14-1.7.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/omid/Desktop/slf4j-1.7.2/slf4j-log4j12-1.7.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/omid/Desktop/slf4j-1.7.2/slf4j-nop-1.7.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/omid/Desktop/slf4j-1.7.2/slf4j-simple-1.7.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Detected both jcl-over-slf4j.jar AND slf4j-jcl.jar on the class path, preempting StackOverflowError. 
SLF4J: See also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:73)
    at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:42)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
    at org.apache.mahout.cf.taste.impl.model.file.FileDataModel.<clinit>(FileDataModel.java:119)
    at recommenderintro.RecommenderIntro.main(RecommenderIntro.java:28)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar AND slf4j-jcl.jar on the class path, preempting StackOverflowError. See also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
    at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:55)
    ... 9 more
Java Result: 1

我是否使用了额外的 jar 文件?

【问题讨论】:

  • 一般来说,当你编写一个依赖于其他软件的程序时,你需要在运行它时包含所有所依赖的软件。这也不例外。

标签: java mahout recommendation-engine mahout-recommender


【解决方案1】:

您需要在您的类路径中使用来自 slf4j 项目的 jar。

http://www.slf4j.org/download.html下载它

【讨论】:

  • @emab 又是 NoClassDefFoundError 吗?
  • 但我认为代码没问题,问题可能出在 LoggerFactory!
  • slf4j.org/codes.html#jclDelegationLoop 所述,您应该从类路径中删除 jcl-over-slf4j.jar 并尝试。我希望你已经完成了 SLFJ 可以委托的记录植入。
  • 什么是“类路径包含多个 SLF4J 绑定。”为了?!
  • stackoverflow.com/questions/7571506/… 这应该会给你一个提示
【解决方案2】:

请从the repository with source code for examples 获取源代码,或至少获取pom.xml。这个pom.xml 指定了所有依赖项,并且所有内容都经过测试,可以在不同的 Mahout 版本上工作。请查看this blog post,了解如何开始使用示例。

【讨论】:

    【解决方案3】:

    谢谢大家。

    在这个问题上纠结了这么久,我终于解决了这个问题!我只是上网到mahout目录并将"mahout/utils/target/dependency/"的所有jar文件添加到类路径中。

    由于我使用 maven 安装 mahout,我还可以使用 ".m2/" 文件夹中的 jar 文件作为依赖项,但第一个解决方案要简单得多。

    【讨论】:

    • 最好使用 Maven 的项目,而不是您的 IDE 的项目 - 使用依赖项更容易操作并且您的项目可以在没有 IDE 的情况下构建等。
    • 但是我该怎么做呢?我不熟悉它!
    • 您可以从示例中复制pom.xml,然后开始添加您的代码。如果我记得,Eclipse 允许直接创建 Maven 项目 - 你只需要安装 m2e 插件
    猜你喜欢
    • 1970-01-01
    • 2013-08-29
    • 2017-08-06
    • 2011-06-07
    • 2014-09-08
    • 1970-01-01
    • 2013-07-11
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多