`
sswh
  • 浏览: 163713 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Maven故障排查

 
阅读更多

最近在使用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提示考虑不足吧!

 

 

 

 

 

 

 

  • 大小: 16.1 KB
  • 大小: 31 KB
分享到:
评论

相关推荐

    maven+nexus学习帮助

    5. **Maven实战**:这部分内容可能包含了一些实际项目中使用Maven的技巧和最佳实践,如多模块项目配置、自定义插件、复杂依赖管理和故障排查等。了解这些实战经验有助于你在实际工作中更高效地运用Maven。 通过学习...

    maven私服教程.zip

    10. 故障排查与优化: 在使用过程中,可能会遇到各种问题,如网络连接错误、依赖找不到等。这时,你可以通过查看Maven日志、检查服务器状态、调整配置等方式进行排查和优化。 通过学习本教程,你将能够熟练地搭建...

    maven-surefire-plugin 2.12

    5. **排除和包含规则**:通过配置,用户可以指定要运行或跳过的特定测试类或方法,这在处理大型测试套件或隔离问题时非常有用。 6. **环境定制**:Surefire 允许用户自定义测试运行时的系统属性和环境变量,这对于...

    Maven The Complete Reference.rar_maven

    10. Maven的故障排查: - 使用`mvn clean install -X`命令查看详细日志,定位问题。 - 使用`dependency:tree`命令查看依赖树,分析冲突。 通过深入学习《Maven The Complete Reference》,开发者不仅可以熟练掌握...

    Netty权威指南源码-maven版

    8. **易于调试和故障排查**:Netty 提供了详细的日志记录和堆栈跟踪,方便开发者定位问题。 在“Netty权威指南源码-maven版”中,你可以看到 Maven 项目的组织结构,包括 `pom.xml` 文件,这是 Maven 项目配置文件...

    jenkins实现maven项目自动部署到tomcat

    故障排查** 文档中提到,对于部署过程中可能出现的问题,会有详细的说明和解决方案,这对于新手来说是非常有帮助的。 总结起来,这个教程详细介绍了如何结合Jenkins、Maven和Tomcat实现自动化构建和部署流程,对于...

    maven-dubbo-consumer

    9. **日志与监控**:Dubbo提供了监控中心,可以记录服务调用的详细信息,帮助开发者分析服务性能和故障。项目可能需要配置日志框架(如Log4j或SLF4J),以便于调试和问题排查。 10. **扩展性**:随着项目的复杂性...

    mavenproject

    【Maven 故障排查】 在遇到 Maven 构建问题时,可以通过查看命令行输出的错误信息、清理项目重新构建、检查网络连接和仓库设置等方法进行排查。此外,`mvn dependency:tree` 命令可以帮助分析项目依赖树,找出潜在...

    spring-mvc+hibernate+druil+maven框架

    它还提供了丰富的监控统计功能,可以帮助开发者实时了解数据库连接的状态,从而进行优化和故障排查。 `Maven`是一个项目管理和综合工具,它通过定义项目的结构和依赖关系,帮助开发者构建、测试和部署软件。Maven...

    vscode-maven:VSCode扩展“ Maven for Java”

    有关故障排除,请参阅的页面。 基本用法 Maven资源管理器该扩展程序将扫描工作区中的pom.xml ,并在边栏中显示所有Maven项目及其模块。 运行插件目标该扩展程序解析Maven项目的有效pom,并按层

    maven3 eclipse plugin

    ** 性能优化与故障排查 ** 为了提升性能,Maven3 Eclipse Plugin提供了缓存机制,但有时可能需要清理或更新本地仓库。此外,如果遇到问题,开发者可以检查Eclipse的错误日志,或者在Maven首选项中调整配置,如设置...

    Dubbo 简单的入门【Maven+SpringMVC+Dubbo 】源码

    - **服务监控(Monitor)**:统计服务的调用次数、耗时等信息,用于性能优化和故障排查。 在Maven+SpringMVC+Dubbo的集成环境中,通常会采用以下步骤: 1. **创建Maven项目**:首先创建一个基于Maven的Java Web...

    Jenkins+Maven+SVN+Tomcat 持续集成环境快捷部署

    需要注意的是,在实际操作中可能会遇到权限问题或网络问题,例如Jenkins WAR文件下载失败,或Tomcat启动失败,这都需要根据具体的错误信息来进行相应的故障排除。同时,建议关闭操作系统的防火墙和安全设置,如...

    Maven 3.1.0

    例如,它可能包含更清晰的错误消息和更好的故障排除支持,使开发者能够更快地定位并解决构建问题。 3. **性能提升**: 为了提高构建速度,Maven 3.1.0 进行了一系列的性能优化。这包括更快的依赖解析,更有效的...

    pwdumper-maven-plugin:转储 Maven 密码 - 用于排除 Wagon 授权的故障

    描述简单明了,指出pwdumper插件的目的是转储Maven密码,辅助排除Wagon授权故障。这意味着该插件可以协助开发者查看Maven的设置,找出可能导致认证失败的原因。 标签为“Java”,意味着这个插件是用Java语言编写的...

    Maven工程Tomcat热部署详解.pdf

    在进行Maven工程的Tomcat热...以上知识内容涵盖了从Java环境搭建、Tomcat安装,到Maven工程中热部署的具体实现步骤及问题排查。对于Java后台开发人员而言,熟练掌握这些知识点对于提高开发效率和应用维护能力至关重要。

    deploy-spring-boot-aws-eb:使用Elastic Beanstalk将Spring Boot Apps部署到AWS

    Visual Studio代码-最新版本Java 8+ Eclipse-Oxygen +-(来自Eclipse的嵌入式Maven) 吉特码头工人ELB CLI安装指南对安装进行故障排除节点JS和NPMVisual Studio程式码Eclipse和嵌入式Maven 故障排除指南:...

    解决更新Maven项目遇到了问题

    - **具体错误**:“故障转移的组织。ApacheMaven插件。插件:Maven资源:罐:2.6形式https://repo.maven.apache.org/maven2缓存在本地存储库,决议将不会再次尝试直到中央的更新时间间隔或更新是被迫的。” - **原始...

    maven 私库 服务器 Nexus 2 安装包 支持 linux

    Maven私库是Java开发中一个重要的工具,它用于管理和存储项目依赖,提高开发效率。Nexus作为一款流行的Maven私库...在实际运维过程中,你还需要关注性能监控、权限管理、故障排查等方面,确保Nexus能够满足团队的需求。

    基于maven install 没反应的解决方法

    在使用Maven的过程中,了解和掌握一些常规的故障排查技能是非常必要的。例如,当Maven命令没有反应时,可以先查看IDE的控制台输出,查看是否有错误信息,这能够帮助快速定位问题所在。同时,对于更复杂的构建问题,...

Global site tag (gtag.js) - Google Analytics