2012-09-17 64 views
0

我有一个项目结构为Java的:异常在线程 “主要” java.lang.NoClassDefFoundError:组织/ SLF4J /的LoggerFactory

myproject/ 
     moduleA/ 
     moduleB/ 
     moduleC/ 

myproject具有pom.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代码。

这是什么我做错了?我怎样才能解决这个问题?

+0

工作你是如何包装的二进制文件和你是如何执行的呢?给定的'pom.xml'只描述了编译时的依赖关系 - 而不是如何打包二进制文件。该错误消息通常是类路径问题。因此,JVM无法在类路径中找到LoggerFactory类的logback实现。 –

回答

7

您正在将您的依赖关系设置为'provided',这意味着它们不会包含在您的运行时类路径中。你基本上告诉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.

所以,你可以忽略你的范围标签或明确地将其添加为编译,当你运行你的应用程序的依赖将被包含在运行时类路径。

+0

我明白了,但是我该如何解决这个问题呢?谢谢 – daydreamer

+0

更改它,使您的依赖项不被标记为“提供”? –

0

按照由@戴夫评论,我也增加了以下我pom.xml,事情开始像往常一样

 <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.6.6</version> 
     </dependency> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>1.0.6</version> 
     </dependency> 
相关问题