Java:线程 "main"java.lang.NoClassDefFoundError 中出现异常:org/slf4j/LoggerFactory

标签 java logging slf4j

我有一个项目结构为

myproject/
         moduleA/
         moduleB/
         moduleC/

myprojectpom.xml

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.3</version>
            <scope>provided</scope>
        </dependency>

现在 moduleC 需要 moduleB 代码,因此它将依赖项引用为

       <dependency>
            <groupId>com.org.myproject</groupId>
            <artifactId>moduleB</artifactId>
            <version>${project.version}</version>
        </dependency>

但是当我在 moduleC 中执行该类时,它会提示

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
......
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

当我的 moduleC 类执行 moduleB 代码时,就会发生这种情况。

我做错了什么?我该如何解决这个问题?

最佳答案

您将依赖项设置为“已提供”,这意味着它们不会包含在您的运行时类路径中。您基本上是在告诉 Maven 您将在运行时提供这些文件,因此它们会在那里进行编译,但除非您手动将它们放入类路径中,否则它们在运行时不会在那里。

看看这里:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope有关每个范围级别的更多信息。

如果您未指定任何内容,则范围将被编译:

Compile is the default scope, used if none is specified. Compile dependencies are available in all classpaths of a project. Furthermore, those dependencies are propagated to dependent projects.

因此,您可以省略作用域标记或将其显式添加为编译,并且当您运行应用程序时,依赖项将包含在运行时类路径中。

关于Java:线程 "main"java.lang.NoClassDefFoundError 中出现异常:org/slf4j/LoggerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468448/

相关文章:

c++ - 观察 QStringList 的新项目

python - 单元测试记录结果文件

java - SLF4J MDC 内存泄漏

spring-boot - 如何让日志文件删除与 spring-boot-starter-log4j2 一起使用?

grails - 嵌套闭包无法访问私有(private)静态字段

java - 打印带有未格式化字符 ("\t"而不是制表符的字符串)

java - 通过服务器读取/写入 Google 表,无需使用 OAuth

java - Alfresco Activiti BPM动态获取候选组或用户

java - 多个SessionFactories,多个DataSources和Hibernate TransactionManager可以只取一个SessionFactory

c++ - 如何定义operator<<方法的结束?