最近在使用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提示考虑不足吧!
相关推荐
有关故障排除,请参阅的页面。 基本用法 Maven资源管理器该扩展程序将扫描工作区中的pom.xml ,并在边栏中显示所有Maven项目及其模块。 运行插件目标该扩展程序解析Maven项目的有效pom,并按层
Visual Studio代码-最新版本Java 8+ Eclipse-Oxygen +-(来自Eclipse的嵌入式Maven) 吉特码头工人ELB CLI安装指南对安装进行故障排除节点JS和NPMVisual Studio程式码Eclipse和嵌入式Maven 故障排除指南:...
pwdumper-maven-插件转储 Maven 密码 - 用于排除 Wagon 授权的故障
Maven 故障安全插件 当必须创建或部署工件以进行测试时,将使用故障安全插件 故障安全插件具有默认文件模式,它寻找作为集成测试运行 我们应该能够通过 JUnit @Category包含组 我们应该能够通过 JUnit @Category...
概述在板上带有 junit5 配置的预配置 ...故障排除...发行说明可以在找到。作者罗曼·别斯克罗夫尼(Roman Beskrovnyi) 致谢...贡献请关注页面。行为守则请遵循页面。执照该项目是 Apache License 2.0 - 详情请参阅文件
ps吉他数据库具有H2 DB的基本Spring JPA应用程序先决条件您将需要以下工具才能使用此项目和代码git( ) JDK 1.8+( ) Maven 3.x +( ) 您选择的IDE。 (Eclipse,IntelliJ,Spring STS,Netbeans等)入门要在本地...
应用程序作为黑盒:代码库管理、构建、故障排除和运行。 30 小时。 培训目标 理解Java平台架构及其典型缺陷 使用版本控制工具管理 Java 代码库的实践技能 了解核心 Java 应用程序结构以实现快速本地化 构建和自动...
概述 Сборкапроектов。...故障排除 ... 发行说明 可以在找到。 作者 Arsen Girinov- 致谢 ... 贡献 请按照页面。 行为守则 请遵循页面。 执照 该项目是Apache License 2.0-有关详细信息,请参阅文件。
Azkaban是一个用Java编写的开源工作流管理系统,旨在简化大数据处理过程中的任务调度和工作流程管理。...同时,编译源代码还有助于用户深入理解系统的工作原理和内部机制,从而更好地进行系统调优和故障排除。
故障排除 构建失败,“类文件版本错误 52.0,应该是 50.0” 在 Mac OS X 上,这是因为 Maven 使用的是 Java 1.6,但依赖项是为 1.8 构建的。 我通过手动将 maven 指向正确的 Java 版本来解决这个问题,即 JAVA_...
Spring Boot代码示例 我们网站所有代码示例 从最畅销的5门课程中学习 ...故障排除 请参阅我们的《故障排除指南》-http: 有用的链接 了解有关in28Minutes和我们创造出色学习体验的方法的更多信息-in28M
故障排除 遇到任何错误时,在报告错误之前,请始终确保已运行mvn clean install并重新测试了该问题。 IDE配置 使用IntelliJ开发时,可以使用内置Maven代替全局Maven。 为此,只需添加一个新的Maven运行配置并按如下...
这个wiki提供jetty的入门教程、基础配置、功能特性、优化、安全、JavaEE、监控、常见问题、故障排除帮助等等。它包含教程、使用手册、视频、特征描述、参考资料以及常见问题。 Jetty文档 ---------------- 入门...
安装和故障排除 视频播放列表 - 迈出第一步 安装和故障排除 视频链接—— Java 最流行的语言 视频 - 先决条件 没有任何 安装 在谷歌上搜索“安装 java jdk”。 选择第一个链接。 你应该去oracle网站。 直接链接是 ...
有关故障排除,请参阅 Homebrew 文档。 服务器需要 Java 1.8 或更高版本。 要检查您的版本,请键入java -version 。从命令行运行服务器将存储库克隆到桌面。 导航到主项目目录。 在命令行中输入java -cp target/...
同时,也提供了日志管理、异常处理等功能,能够更好地帮助管理员了解系统运行情况和进行故障排查。总之,这个项目是一个功能完善、技术先进的网吧管理系统,能够帮助网吧管理员更好地运营和管理网吧,提高管理效率和...
这是一个最小的“聊天客户端”,允许在对正在开发的 javabot 进行离线测试和故障排除 这不是什么: 一个测试套件。 这是允许手动故障排除和测试 JavaBot 的最小“实现”,在聊天中将被称为“初级”。 JavaBot ...
:)使用的依赖冬眠弹簧框架Spring安全Spring社交JSP-Servlet API JSTL Log4J 朱尼特使用环境蚀火星Tomcat 7.0.45故障排除如何复制此存储库? 确保已在计算机上安装了GIT。 如果没有,请从下载确认正确的安装。 打开...
这应该很简单,并且在故障排除和错误修复方面最实用。 用户手册可以在找到。 从 github 克隆bmkeg-parent项目以设置所有依赖版本和存储库: git clone https://github.com/BMKEG/bmkeg-parent 克隆sciKnowMine...
试用SSL 一个非常简单的 HTTPS 连接诊断工具,最初创建用于对进行故障排除。要求要运行该程序,您需要: 一个可用的 Java 开发工具包,版本 5 或更高版本Apache Maven 2+建造要构建该工具,只需发出正常的 maven ...