我有一个项目结构为
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
代码时,就会发生这种情况。我做错了什么?我怎样才能解决这个问题?
最佳答案
您将依赖项设置为“提供”,这意味着它们将不会包含在运行时类路径中。您基本上是在告诉Maven,您将在运行时提供这些文件,因此它们可以在那里进行编译,但是除非您手动将它们放在类路径中,否则它们将在运行时不存在。
在这里查看:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope有关每个范围级别的更多信息。
如果您不指定任何内容,则范围将被编译:
编译是默认作用域,如果未指定,则使用它。编译依赖项在项目的所有类路径中均可用。此外,这些依赖项会传播到相关项目。
因此,您可以省略范围标记或将其明确添加为编译标记,并且在您运行应用程序时,依赖项将包含在运行时类路径中。