Maven 是一个自动构建项目管理工具,通过在 中定义所有的依赖关系来实现构建过程的自动化。pom.xml
开发人员在开发阶段和发布阶段构建和运行maven项目时,会遇到很多问题。
本文解释了如何调试maven构建中的任何问题的多种方法。
调试maven项目的方法有很多。
以下是调试maven构建问题的不同方法:
- 使用
-x或--debug或命令行-e - mvn依赖树
- 使用maven surefire插件进行调试
我列出了找出真正问题的必要步骤。
maven调试模式
如果您在运行maven目标(如compile 或install )时遇到问题,会显示信息。如果发生任何故障,这些信息对找出确切原因没有帮助。
在这种情况下,请尝试运行maven 命令,选择-X 、-e 或--debug 标志,这样可以清楚地显示错误发生的位置、插件配置和详细的类加载信息,这对编码人员找到问题的真正原因很有帮助。
这种方法完全适用于maven插件的编纂者:
mvn -X prints debugging messages
or
mvn -e shows error messages
mvn -e shows error messages
请记住,这只是maven在构建项目时的调试信息。
这不是为你的项目调试,即不同的概念。我将在以后的文章中再写一篇关于java项目调试技巧的文章。
该选项将以调试模式启动maven。它将提供完整的信息,如加载到项目中的不同依赖项以及正在运行的目标。
maven中的依赖性问题
在实时的maven项目构建中,我们看到我们的项目有direct ,也有indirect 的依赖。
假设在你的项目中,你直接依赖一个模块,比如log4j-1.2.12 ,你还有一个间接依赖log4j-1.2.12 (来自spring 2.0.6 ,该模块对你的项目有依赖性)。这就是你的项目有两个相同的模块(log4j)但版本不同的情况。这将导致在网络服务器上启动项目时,类的加载出现不兼容的问题。那么你必须在你的pom.xml中保留所需的模块,并通过指定排除配置忽略另一个模块。
要找出你的项目的依赖树,你必须使用下面的命令
mvn dependency:tree
这个命令以树状资源管理器的格式列出了你的项目的所有依赖关系,所有这些依赖关系都被下载到你的本地资源库。
你可以找出需要保留和排除的版本,如下所示,如果我们想把log4j从spring依赖中排除,你可以在exclusions 和exclusion 标签中使用dependency 标签。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.1</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>jetty</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
用maven surefire调试测试
我们将使用mvn test来运行maven项目的测试案例。如你所知,maven surefire插件用于运行项目的单元测试。
你必须在maven测试目标中提供maven.surefire.debug属性。
mvn -Dmaven.surefire.debug test
这将在一个单独的进程中运行测试。该进程将监听5005端口。你可以把这个进程附加到eclipse上进行远程调试。在eclipse中,你必须创建并配置maven调试选项,如下所示。
hostname is localhost
`and port is 5005`
这是maven提供的最酷的eclipse远程调试功能之一 。 每当我们开始执行maven测试用例时,你可以在测试类中设置断点以停止调试器,达到调试目的。一旦maven执行结束,eclipse调试器就会终止该进程。
另一种方法是不以分叉模式运行调试器,即在同一进程中执行测试,我们可以使用
mvn -DforkMode never test