在搭建web项目时,出现一个比较诡异的问题,任何JSP页面突然都不能够正常地显示,系统爆出HTTP:500(服务器内部错误)的页面
HTTP Status 500 - java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem;
type Exception report
message java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem;
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem; org.apache.jasper.servlet.JspServlet.service(JspServlet.java:273) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) javax.servlet.http.HttpServlet.service(HttpServlet.java:620) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem; org.apache.jasper.compiler.JDTCompiler$2.acceptResult(JDTCompiler.java:354) org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:480) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:425) org.apache.jasper.compiler.Compiler.compile(Compiler.java:298) org.apache.jasper.compiler.Compiler.compile(Compiler.java:277) org.apache.jasper.compiler.Compiler.compile(Compiler.java:265) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:299) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:939) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) javax.servlet.http.HttpServlet.service(HttpServlet.java:620) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
经过初步查看堆栈,大意是将JSP编译成Servlet产生了错误,类不匹配,怀疑可能是JSTL,Servlet和Tomcat版本产生了冲突。一番折腾,没有进展。
于是思考了一下,刚才只不过是添加了hadoop hdfs相关的jar包:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-auth</artifactId> <version>2.2.0</version> </dependency>
难道是其中包含了一些特殊的依赖?通过IntelliJ Idea中的pom编辑器,可以显示Maven Show Dependencies:
可以看出所有的依赖关系,果然,hadoop-common包依赖了servlet-api, jasper-runtime等可能与当前环境冲突的jar包,由于这些都是通过依赖关系链产生的关系,所以非常不容易被察觉。
同样,也可以通过mvn自带的工具在项目中命令行操作得到整个依赖的树形结构:
mvn dependency: tree [INFO] com.xxx:diablo-framework:war:1.0-SNAPSHOT [INFO] +- javax.servlet:jstl:jar:1.2:compile [INFO] +- javax:javaee-api:jar:6.0:provided [INFO] +- log4j:log4j:jar:1.2.8:compile [INFO] +- com.sun.mail:javax.mail:jar:1.5.2:compile [INFO] | \- javax.activation:activation:jar:1.1:compile [INFO] +- commons-io:commons-io:jar:2.4:compile [INFO] +- commons-beanutils:commons-beanutils:jar:1.9.2:compile [INFO] | +- commons-logging:commons-logging:jar:1.1.1:compile [INFO] | \- commons-collections:commons-collections:jar:3.2.1:compile [INFO] +- commons-lang:commons-lang:jar:2.6:compile [INFO] +- org.codehaus.jackson:jackson-xc:jar:1.9.13:compile [INFO] | \- org.codehaus.jackson:jackson-core-asl:jar:1.9.13:compile [INFO] +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.13:compile [INFO] +- commons-httpclient:commons-httpclient:jar:3.1:test [INFO] | \- commons-codec:commons-codec:jar:1.2:compile [INFO] +- junit:junit:jar:4.11:test [INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] +- org.springframework:spring-core:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-aop:jar:3.2.2.RELEASE:compile [INFO] | \- aopalliance:aopalliance:jar:1.0:compile [INFO] +- org.springframework:spring-aspects:jar:3.2.2.RELEASE:compile [INFO] | \- org.aspectj:aspectjweaver:jar:1.7.2:compile [INFO] +- org.springframework:spring-beans:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-context:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-context-support:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-dao:jar:2.0.8:compile [INFO] +- org.springframework:spring-expression:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-jdbc:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-jms:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-orm:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-oxm:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-test:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-tx:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-web:jar:3.2.2.RELEASE:compile [INFO] +- org.springframework:spring-webmvc:jar:3.2.2.RELEASE:compile [INFO] +- org.apache.commons:commons-exec:jar:1.3:compile [INFO] +- commons-dbcp:commons-dbcp:jar:1.4:compile [INFO] | \- commons-pool:commons-pool:jar:1.5.4:compile [INFO] +- org.hibernate:hibernate-core:jar:3.6.10.Final:compile [INFO] | +- antlr:antlr:jar:2.7.6:compile [INFO] | +- dom4j:dom4j:jar:1.6.1:compile [INFO] | +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile [INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile [INFO] | +- javax.transaction:jta:jar:1.1:compile [INFO] | \- org.slf4j:slf4j-api:jar:1.6.1:compile [INFO] +- org.hibernate:hibernate-entitymanager:jar:3.6.10.Final:compile [INFO] | +- cglib:cglib:jar:2.2:compile [INFO] | | \- asm:asm:jar:3.1:compile [INFO] | \- javassist:javassist:jar:3.12.0.GA:compile [INFO] +- net.sf.ehcache:ehcache-core:jar:2.6.9:compile [INFO] +- mysql:mysql-connector-java:jar:5.1.31:compile [INFO] +- org.hsqldb:hsqldb:jar:2.2.9:compile [INFO] +- commons-fileupload:commons-fileupload:jar:1.3.1:compile [INFO] +- org.apache.poi:poi:jar:3.5-FINAL:compile [INFO] +- org.apache.poi:poi-ooxml:jar:3.5-FINAL:compile [INFO] | \- org.apache.poi:ooxml-schemas:jar:1.0:compile [INFO] | \- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile [INFO] | \- stax:stax-api:jar:1.0.1:compile [INFO] +- org.apache.oozie:oozie-client:jar:4.1.0:compile [INFO] | +- com.googlecode.json-simple:json-simple:jar:1.1:compile [INFO] | +- commons-cli:commons-cli:jar:1.2:compile [INFO] | +- com.google.guava:guava:jar:11.0.2:compile [INFO] | | \- com.google.code.findbugs:jsr305:jar:1.3.9:compile [INFO] | +- org.apache.activemq:activemq-client:jar:5.8.0:compile [INFO] | | +- org.apache.geronimo.specs:geronimo-jms_1.1_spec:jar:1.1.1:compile [INFO] | | +- org.fusesource.hawtbuf:hawtbuf:jar:1.9:compile [INFO] | | \- org.apache.geronimo.specs:geronimo-j2ee-management_1.1_spec:jar:1.0.1:compile [INFO] | +- org.slf4j:slf4j-simple:jar:1.6.6:compile [INFO] | \- xerces:xercesImpl:jar:2.10.0:compile [INFO] | \- xml-apis:xml-apis:jar:1.4.01:compile [INFO] +- org.freemarker:freemarker:jar:2.3.20:compile [INFO] +- org.apache.hadoop:hadoop-common:jar:2.2.0:compile [INFO] | +- org.apache.hadoop:hadoop-annotations:jar:2.2.0:compile [INFO] | +- org.apache.commons:commons-math:jar:2.1:compile [INFO] | +- xmlenc:xmlenc:jar:0.52:compile [INFO] | +- commons-net:commons-net:jar:3.1:compile [INFO] | +- org.mortbay.jetty:jetty:jar:6.1.26:compile [INFO] | +- org.mortbay.jetty:jetty-util:jar:6.1.26:compile [INFO] | +- com.sun.jersey:jersey-core:jar:1.9:compile [INFO] | +- com.sun.jersey:jersey-json:jar:1.9:compile [INFO] | | +- org.codehaus.jettison:jettison:jar:1.1:compile [INFO] | | +- com.sun.xml.bind:jaxb-impl:jar:2.2.3-1:compile [INFO] | | | \- javax.xml.bind:jaxb-api:jar:2.2.2:compile [INFO] | | \- org.codehaus.jackson:jackson-jaxrs:jar:1.8.3:compile [INFO] | +- com.sun.jersey:jersey-server:jar:1.9:compile [INFO] | +- commons-el:commons-el:jar:1.0:compile [INFO] | +- net.java.dev.jets3t:jets3t:jar:0.6.1:compile [INFO] | +- commons-configuration:commons-configuration:jar:1.6:compile [INFO] | | +- commons-digester:commons-digester:jar:1.8:compile [INFO] | | \- commons-beanutils:commons-beanutils-core:jar:1.8.0:compile [INFO] | +- org.slf4j:slf4j-log4j12:jar:1.7.5:compile [INFO] | +- org.apache.avro:avro:jar:1.7.4:compile [INFO] | | +- com.thoughtworks.paranamer:paranamer:jar:2.3:compile [INFO] | | \- org.xerial.snappy:snappy-java:jar:1.0.4.1:compile [INFO] | +- com.google.protobuf:protobuf-java:jar:2.5.0:compile [INFO] | +- com.jcraft:jsch:jar:0.1.42:compile [INFO] | +- org.apache.zookeeper:zookeeper:jar:3.4.5:compile [INFO] | \- org.apache.commons:commons-compress:jar:1.4.1:compile [INFO] | \- org.tukaani:xz:jar:1.0:compile [INFO] +- org.apache.hadoop:hadoop-hdfs:jar:2.2.0:compile [INFO] | +- commons-daemon:commons-daemon:jar:1.0.13:compile [INFO] | +- javax.servlet.jsp:jsp-api:jar:2.1:compile [INFO] | \- tomcat:jasper-runtime:jar:5.5.23:compile [INFO] +- org.apache.hadoop:hadoop-auth:jar:2.2.0:compile [INFO] +- com.xxx:diablo.communication:jar:1.0-SNAPSHOT:compile [INFO] +- com.caucho:hessian:jar:3.1.5:compile [INFO] \- org.quartz-scheduler:quartz:jar:1.8.4:compile
于是,通过右键将这些jar包排除(Exclude)出去,最后编辑生成的依赖成为了这样:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.2.0</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>jasper-compiler</artifactId> <groupId>tomcat</groupId> </exclusion> <exclusion> <artifactId>jasper-runtime</artifactId> <groupId>tomcat</groupId> </exclusion> <exclusion> <artifactId>jsp-api</artifactId> <groupId>javax.servlet.jsp</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.2.0</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> </exclusions> </dependency>
问题才得以解决,在普通的Java应用中,当出现相同版本的jar包,class时,是根据启动时的CLASSPATH先后顺序来决定最终使用的是哪个类型,但是这样就非常不确定。虽然OSGi技术可以通过隔离ClassLoader的方式解决这个问题,但OSGi本身稍显复杂臃肿,学习成本比较高,而且同样需要一个OSGi容器。这就要求我们在平时引入新的jar包时能够对其进行依赖分析,找出可能产生冲突的jar包,最终解决问题。
相关推荐
本资源“maven依赖包(用于博客项目)”显然包含了一系列与博客项目相关的Maven依赖,这些依赖可能包括数据库连接库、模板引擎、日志框架、安全组件以及其他有助于构建博客平台的Java库。 1. **Maven仓库**: ...
1. **依赖冲突**:当项目中的多个库引用了不同版本的同一个依赖时,可能导致冲突。解决方法是在pom.xml中明确指定依赖的版本,或者使用 `<dependencyManagement>` 标签来统一管理所有子模块的依赖版本。 2. **插件...
这大大简化了项目的构建过程,但同时也可能导致依赖冲突,需要通过排除机制或调整依赖版本来解决。 在`<dependency>`标签内,还可以添加`<exclusions>`子标签来排除特定的依赖,避免冲突。例如: ```xml ...
5. **仓库**:Maven依赖的存储库,包括本地仓库(默认在用户目录下)和远程仓库(如中央仓库mvnrepository.com)。当本地仓库没有所需依赖时,Maven会尝试从远程仓库下载。 6. **排除依赖(exclude)**:有时候我们...
本文将详细介绍Maven项目搭建过程中可能遇到的一些常见问题及其解决方法。 #### 1. Eclipse Maven项目无法识别src/main/java源文件夹 **问题描述**: 在使用Eclipse进行Maven项目开发时,有时会发现src/main/java...
本示例将详细介绍如何使用Maven搭建一个基础的Web项目,并解决创建过程中可能出现的报错问题。 ### 一、Maven环境配置 首先,确保你已经安装了Java Development Kit (JDK),因为Maven是基于Java的。接着,下载Maven...
总的来说,Maven的依赖管理功能非常强大,可以帮助我们有效地管理和解决项目依赖问题。通过合理地使用POM文件、依赖范围、依赖调解和传递性依赖等机制,我们可以更好地构建和维护我们的Maven项目。
在这个名为"Maven依赖包(用于博客项目)v2"的压缩包中,我们可以推测它包含了为一个博客项目准备的特定Maven依赖库。 Maven依赖管理的核心在于它的`pom.xml`文件,这是一个项目对象模型(Project Object Model)的...
综上所述,“Maven管理的Web项目”意味着开发者可以通过Maven实现对Java Web应用的便捷管理,包括构建、依赖管理、测试和部署等整个生命周期。Maven的标准化和自动化特性显著提高了开发效率,降低了维护成本。在实际...
3. **更智能的依赖解析**:改进了依赖冲突的解决策略,能更好地处理版本冲突。 4. **更好的错误报告**:提供了更清晰的错误信息,方便开发者定位问题。 5. **支持HTTP/2**:Maven 3.3.9开始支持HTTP/2协议,提高了...
1. **依赖管理**: Maven 通过 pom.xml 文件管理项目的依赖关系,自动下载并解决依赖冲突。 2. **构建工具**: 支持编译、测试、打包、部署等构建过程,简化开发流程。 3. **插件支持**: Maven 有许多插件,可以执行...
但是,在使用 Maven 进行项目开发时,经常会遇到 jar 包冲突的问题。jar 包冲突是指在项目中引入了多个版本的同一个jar包,这可能会导致项目编译或运行时出现问题。 解决 jar 包冲突问题是非常重要的,因为它直接...
通过以上步骤,我们可以有效地解决Maven项目中的jar依赖冲突问题。需要注意的是,在处理依赖冲突时一定要仔细检查每个库的版本号以及它们之间的关系,避免引入新的冲突。此外,使用Maven插件如`dependency:tree`可以...
2. Maven依赖冲突特性 当不同依赖引入了相同但不同版本的库时,会产生依赖冲突。Maven遵循“nearest wins”原则解决冲突,但可能需要手动调整。 七、Maven工程继承和聚合关系 1. Maven工程继承关系 一个父pom可以...
- **依赖管理**:Maven通过POM自动管理项目所依赖的库,解决了类路径问题,减少了jar包冲突。 - **生命周期 (Lifecycle)**:Maven有一套预定义的构建阶段,如`clean`、`compile`、`test`、`package`、`deploy`等,...
10. **依赖冲突解决** Maven的依赖管理采用“最接近原则”解决依赖冲突,但有时需要手动调整依赖的版本或排除不必要的子依赖。 通过上述配置,我们可以使用Maven高效地生成和管理Web项目。在实际开发中,`pom.xml`...
2. Maven依赖管理:学会在`pom.xml`文件中配置依赖,解决jar包冲突,以及利用Maven仓库下载远程依赖。 3. Web项目的结构:了解`web.xml`的作用,以及`WEB-INF`目录下其他文件和目录的用途。 4. Spring Boot或...
最后,关于"mavenweb"标签,可能涉及到的是与Maven相关的Web开发实践,包括但不限于Maven多模块项目构建、使用Maven进行持续集成、处理复杂的依赖管理和冲突解决、自定义Maven插件等。 总的来说,"mavenweb项目创建...
Maven使用中央仓库来存储各种开源库的jar包,通过POM.xml文件定义项目依赖,使得版本升级和依赖冲突的解决变得更为便捷。 二、开发环境准备 1. **JDK**:Java开发的基础,确保安装了支持Web开发的JDK版本。 2. **...
1. **依赖管理**:Maven可以自动下载项目所依赖的库文件,并解决版本冲突问题。 2. **构建工具**:它负责编译源码、运行测试、打包应用(如JAR或WAR)以及部署到服务器。 3. **插件系统**:Maven拥有丰富的插件库,...