Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Maven构建时解决NoClassDefFoundError_Java_Testing_Maven_Noclassdeffounderror_Classnotfoundexception - Fatal编程技术网

Java 使用Maven构建时解决NoClassDefFoundError

Java 使用Maven构建时解决NoClassDefFoundError,java,testing,maven,noclassdeffounderror,classnotfoundexception,Java,Testing,Maven,Noclassdeffounderror,Classnotfoundexception,在使用Maven运行测试时,我遇到了由ClassNotFoundException引起的NoClassDefFoundError。未找到的类肯定存在于我的本地存储库中 有问题的依赖项如下所示:默认的作用域依赖项依赖于一个jar,该jar的作用域被标记为提供的,而classloader没有找到的文件位于该jar中。它编译正常,但在运行应用程序时找不到该文件 我已经修复了这个错误,将“提供的jar”作为运行时范围的依赖项明确地添加到pom中,但我想了解发生了什么 1) 如果我正在运行一些测试,那么d

在使用Maven运行测试时,我遇到了由ClassNotFoundException引起的NoClassDefFoundError。未找到的类肯定存在于我的本地存储库中

有问题的依赖项如下所示:默认的作用域依赖项依赖于一个jar,该jar的作用域被标记为提供的,而classloader没有找到的文件位于该jar中。它编译正常,但在运行应用程序时找不到该文件

我已经修复了这个错误,将“提供的jar”作为运行时范围的依赖项明确地添加到pom中,但我想了解发生了什么

1) 如果我正在运行一些测试,那么dependency scope=提供的含义是什么?我知道servlet容器可以有一些提供的jar,比如servlet-api.jar,但是测试呢?这看起来像是我们pom中的一个错误,不是吗? 除了servlet-api.jar(和similair web服务器jars)之外,我们还应该使用“提供的”范围吗

2) 我试图使用maven命令行参数-U来寻找这个问题的解决方案。据我所知,它迫使Maven检查远程存储库,并在必要时从那里获取最新的依赖项。 问题是:如果我没有指定这个命令,会发生什么?它总是从本地存储库获取过时的依赖项?如果没有,那么为什么我需要这个命令

3) 为了解决这样的问题,最好在编译代码时知道哪些JAR真正在类路径上,在运行代码时知道哪些JAR在类路径上。Maven是否可能?

1)提供的始终意味着不应将依赖项复制到构建的工件。某些依赖项声明为已提供的测试将不会运行,因为运行时需要这些依赖项。例如,您可以通过创建自己的概要文件“Test”来解决这个问题。因此,在“测试”概要文件中,您将依赖项声明为默认范围,这将覆盖提供的范围。之后,可以使用以下命令运行测试:

`mvn <goal> -PTest`
`mvn-PTest`
有关信息,请参阅

2) 据我所知,命令行参数-U将导致重新获取依赖项,因为您的存储库可能会被破坏(例如,如果您在其中更改或删除了文件)

3)
mvn依赖项:提供的树始终意味着不应将依赖项复制到构建的工件中。某些依赖项声明为已提供的测试将不会运行,因为运行时需要这些依赖项。例如,您可以通过创建自己的概要文件“Test”来解决这个问题。因此,在“测试”概要文件中,您将依赖项声明为默认范围,这将覆盖提供的范围。之后,可以使用以下命令运行测试:

`mvn <goal> -PTest`
`mvn-PTest`
有关信息,请参阅

2) 据我所知,命令行参数-U将导致重新获取依赖项,因为您的存储库可能会被破坏(例如,如果您在其中更改或删除了文件)

3)
mvn依赖关系:tree

1)您可以使用“测试容器”(Jetty,Tomcat)运行测试,在这种情况下,只要范围合理(例如,我在prod中使用Tomcat,但在Jetty中使用单元测试,它们甚至没有提供的jar的相同版本)

2) 默认情况下,Maven获取它在本地回购协议中找到的JAR,如果不是快照,也不搜索最近的JAR。 如果您提供了自己的JAR,那么应该始终增加版本,即使有时很烦人

3) mvn dependency:tree可以为您提供项目的所有dependency树。一些IDE(我使用eclipse)也为您提供了一些不错的UI工具来查看它们。

1)您可以使用“测试容器”(Jetty,Tomcat)运行测试,在这种情况下,提供的范围也是有意义的(例如,我在prod中使用Tomcat,但在Jetty中使用单元测试,它们甚至没有提供的JAR的相同版本)

2) 默认情况下,Maven获取它在本地回购协议中找到的JAR,如果不是快照,也不搜索最近的JAR。 如果您提供了自己的JAR,那么应该始终增加版本,即使有时很烦人

3) mvn dependency:tree可以为您提供项目的所有dependency树。一些IDE(我使用eclipse)也提供了一些不错的UI工具来查看它们