最近在使用pinpoint-2.7,在调试某些模块源码时,发现在Maven-Install步骤总是会失败。
但Maven的错误提示语焉不详。例如下面:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:testCompile (default-testCompile) on project pinpoint-bootstrap: Compilation failure -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging.
即使我们打开Maven的 Debug Output(-X)详细错误日志,仍然什么都看不到。
郁闷之极。
实在没有办法,只能祭出“断点调试”这最后一步棋了!
第一步,我们找到出错的插件和目标:org.apache.maven.plugins:maven-compiler-plugin:3.5.1:testCompile
第二步,新建一个demo工程,我们把错误插件添加到Maven依赖中来
<dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <scope>provided</scope> </dependency>
第三步,找到maven-compiler-plugin-3.5.1.jar中插件定义plugin.xml文件,搜索“testCompile”目标,
找到它的实现类:
<implementation>org.apache.maven.plugin.compiler.TestCompilerMojo</implementation>
然后,在TestCompilerMojo的execute()方法上打上断点
第四步,首先在项目上右键:Run As - Maven-Install,产生一个运行配置。
然后,在Eclipse的调试配置中,找到刚产生的运行配置,注意在“Maven Build”下面。
在目标中输入“clean install”
点击调试按钮。这时候,Maven运行会停在断点位置。但是会找不到源代码。
第五步,我们把源代码关联进来。首先在demo项目上,执行Maven - Download Sources,
把依赖部分的源码下载下来。
然后,回到上一步的调试配置,打开“Source”标签页,用Add方法添加源码搜索路径:
M2_REPO/org/apache/maven/plugins/maven-compiler-plugin/3.5.1/maven-compiler-plugin-3.5.1.jar
注意,不要上面添加的不是-sources.jar文件。(好处是调试时,在display视图中可以直接执行代码片段)
第六步,重新执行debug clean install,这时候,我们发现断点停留在TestCompilerMojo.execute()方法
对应行。我们沿着调用栈向上寻找,找到最近的catch(Exception)的代码位置,我们加上断点。
这儿找到的位置是:MojoExecutor.java
try { pluginManager.executeMojo( session, mojoExecution ); } catch ( MojoFailureException | PluginManagerException | PluginConfigurationException | MojoExecutionException e ) { throw new LifecycleExecutionException( mojoExecution, session.getCurrentProject(), e ); }
第七步,继续执行,这时候,我们发现断点停留在catch后的位置,
我们点开变量视图,查看此时的异常对象类型,发现是:org.apache.maven.plugin.compiler.CompilationFailureException
然后,我们进入断点视图,添加对应的“异常断点”。
第八步,重新开始调试。这时候我们发现断点停留在org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute()方法上。
根据代码,我们知道,当warnings为空的时候,将丢出此异常。
继续向上快速阅读源码,我们知道 当compilerResult返回false时,会触发编译失败异常,这也很容易理解。
第九步,我们找到CompilerResult这个类的代码(maven会自动下载打开类的代码),
找到success字段,将这个字段的写操作添加到断点中。
第十步,重启调试,这次断点停留在CompilerResult的构造函数(<init>方法)上。
我们查看java栈,找到下一个调用方法,发现断点停留在:
org.codehaus.plexus.compiler.javac.JavacCompiler.compileOutOfProcess()方法。
这也很容易理解了,Maven 编译过程调用了外部的JavaC命令行。
第十一步,我们找到了核心执行语句:
returnCode = CommandLineUtils.executeCommandLine( cli, out, err );
这时候查看 cli 的参数,其值类似于:
cmd.exe /X /C "D:\eclipse4oschina\jdk1.6.0_23\bin\javac @C:/Users/caohj/AppData/Local/Temp/org.codehaus.plexus.compiler.javac.JavacCompiler8877254923779120414arguments"
第十二步,我们打开一个新的CMD窗口,把cmd命令拷贝出来,放在命令行执行。
这时候我们终于看到了错误提示:
错误:读取 D:\m2\net\bytebuddy\byte-buddy\1.6.11\byte-buddy-1.6.11.jar 时出错; invalid LOC header (bad signature) 1 错误
原来,罪魁祸首是Maven在下载byte-buddy库时出现了错误。
我们删除对应的JAR,然后回到Eclipse中,在项目上右键 Maven - Update Project,重新下载需要的JAR
我们发现,两次下载的JAR文件果然大小不一样。
重新执行 Maven-Install, 故障排除。
---------------------------------------------------------
故障排除后,我们来看一下,为什么Maven没有提示出编译错误呢?
我们重新把错误的byte-buddy JAR包还原,再次进入调试。
断点跟踪,终于发现问题所在:plexus-compiler-javac/2.7版的
org.codehaus.plexus.compiler.javac.JavacCompiler.parseModernStream()方法
在解析JavaC命令行错误时,有一处关键语句:
if ( ( buffer.length() == 0 ) && line.startsWith( "error: " ) ) { errors.add( new CompilerMessage( line, true ) ); }
但是命令行返回的提示却是:
错误:读取 D:\m2\net\bytebuddy\byte-buddy\1.6.11\byte-buddy-1.6.11.jar 时出错;invalid LOC header (bad signature)
“error:” 和 "错误:" ----- 这可能是对中文版JavaC提示考虑不足吧!
相关推荐
5. **Maven实战**:这部分内容可能包含了一些实际项目中使用Maven的技巧和最佳实践,如多模块项目配置、自定义插件、复杂依赖管理和故障排查等。了解这些实战经验有助于你在实际工作中更高效地运用Maven。 通过学习...
10. 故障排查与优化: 在使用过程中,可能会遇到各种问题,如网络连接错误、依赖找不到等。这时,你可以通过查看Maven日志、检查服务器状态、调整配置等方式进行排查和优化。 通过学习本教程,你将能够熟练地搭建...
5. **排除和包含规则**:通过配置,用户可以指定要运行或跳过的特定测试类或方法,这在处理大型测试套件或隔离问题时非常有用。 6. **环境定制**:Surefire 允许用户自定义测试运行时的系统属性和环境变量,这对于...
10. Maven的故障排查: - 使用`mvn clean install -X`命令查看详细日志,定位问题。 - 使用`dependency:tree`命令查看依赖树,分析冲突。 通过深入学习《Maven The Complete Reference》,开发者不仅可以熟练掌握...
8. **易于调试和故障排查**:Netty 提供了详细的日志记录和堆栈跟踪,方便开发者定位问题。 在“Netty权威指南源码-maven版”中,你可以看到 Maven 项目的组织结构,包括 `pom.xml` 文件,这是 Maven 项目配置文件...
故障排查** 文档中提到,对于部署过程中可能出现的问题,会有详细的说明和解决方案,这对于新手来说是非常有帮助的。 总结起来,这个教程详细介绍了如何结合Jenkins、Maven和Tomcat实现自动化构建和部署流程,对于...
9. **日志与监控**:Dubbo提供了监控中心,可以记录服务调用的详细信息,帮助开发者分析服务性能和故障。项目可能需要配置日志框架(如Log4j或SLF4J),以便于调试和问题排查。 10. **扩展性**:随着项目的复杂性...
【Maven 故障排查】 在遇到 Maven 构建问题时,可以通过查看命令行输出的错误信息、清理项目重新构建、检查网络连接和仓库设置等方法进行排查。此外,`mvn dependency:tree` 命令可以帮助分析项目依赖树,找出潜在...
它还提供了丰富的监控统计功能,可以帮助开发者实时了解数据库连接的状态,从而进行优化和故障排查。 `Maven`是一个项目管理和综合工具,它通过定义项目的结构和依赖关系,帮助开发者构建、测试和部署软件。Maven...
有关故障排除,请参阅的页面。 基本用法 Maven资源管理器该扩展程序将扫描工作区中的pom.xml ,并在边栏中显示所有Maven项目及其模块。 运行插件目标该扩展程序解析Maven项目的有效pom,并按层
** 性能优化与故障排查 ** 为了提升性能,Maven3 Eclipse Plugin提供了缓存机制,但有时可能需要清理或更新本地仓库。此外,如果遇到问题,开发者可以检查Eclipse的错误日志,或者在Maven首选项中调整配置,如设置...
- **服务监控(Monitor)**:统计服务的调用次数、耗时等信息,用于性能优化和故障排查。 在Maven+SpringMVC+Dubbo的集成环境中,通常会采用以下步骤: 1. **创建Maven项目**:首先创建一个基于Maven的Java Web...
需要注意的是,在实际操作中可能会遇到权限问题或网络问题,例如Jenkins WAR文件下载失败,或Tomcat启动失败,这都需要根据具体的错误信息来进行相应的故障排除。同时,建议关闭操作系统的防火墙和安全设置,如...
例如,它可能包含更清晰的错误消息和更好的故障排除支持,使开发者能够更快地定位并解决构建问题。 3. **性能提升**: 为了提高构建速度,Maven 3.1.0 进行了一系列的性能优化。这包括更快的依赖解析,更有效的...
描述简单明了,指出pwdumper插件的目的是转储Maven密码,辅助排除Wagon授权故障。这意味着该插件可以协助开发者查看Maven的设置,找出可能导致认证失败的原因。 标签为“Java”,意味着这个插件是用Java语言编写的...
在进行Maven工程的Tomcat热...以上知识内容涵盖了从Java环境搭建、Tomcat安装,到Maven工程中热部署的具体实现步骤及问题排查。对于Java后台开发人员而言,熟练掌握这些知识点对于提高开发效率和应用维护能力至关重要。
Visual Studio代码-最新版本Java 8+ Eclipse-Oxygen +-(来自Eclipse的嵌入式Maven) 吉特码头工人ELB CLI安装指南对安装进行故障排除节点JS和NPMVisual Studio程式码Eclipse和嵌入式Maven 故障排除指南:...
- **具体错误**:“故障转移的组织。ApacheMaven插件。插件:Maven资源:罐:2.6形式https://repo.maven.apache.org/maven2缓存在本地存储库,决议将不会再次尝试直到中央的更新时间间隔或更新是被迫的。” - **原始...
Maven私库是Java开发中一个重要的工具,它用于管理和存储项目依赖,提高开发效率。Nexus作为一款流行的Maven私库...在实际运维过程中,你还需要关注性能监控、权限管理、故障排查等方面,确保Nexus能够满足团队的需求。
在使用Maven的过程中,了解和掌握一些常规的故障排查技能是非常必要的。例如,当Maven命令没有反应时,可以先查看IDE的控制台输出,查看是否有错误信息,这能够帮助快速定位问题所在。同时,对于更复杂的构建问题,...