maven项目启动、访问的两个问题
一、依赖冲突问题
项目可以正常启动,但是访问就报错:java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest"
这是一个依赖冲突问题。比如我出现这个问题是因为在pom.xml中导入了两个jar包,而这两个jar包是tomcat自带有的:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
在tomcat下的lib目录里有这两个jar包:
因为而导致自己导入的导入的jar包(在本地仓库或者*仓库)和tomcat的 jar包冲突。要解决这个问题可以为导入的jar包添加作为范围,也就是添加一个< scope >标签,将导入的jar包作用范围缩小,scope的值可以为以下几个:
- compile:默认值,也就是不声明scope标签,表示被导入的jar包参与当前项目的编译、测试、运行、打包。这是一个作用比较强的依赖;
- test:表示被导入jar包仅仅是参与测试工作,比如Junit包;
- runtime:表示被导入jar包不参与编译、参与测试、运行;
- provided:表示被导入jar包参与项目的编译、测试、运行,但是不会被打包的时候包括进去,而是在别的地方有这些jar包
二、maven web项目可以启动但是访问报错
maven web项目可使用命令 tomcat:run
启动,但是访问的时候报错: org.apache.jasper.JasperException: Unable to compile class for JSP:
, 这是因为命令 tomcat:run
默认使用tomcat6,而tomcat6不支持jdk1.6之后的版本,要配置成tomcat7。在pom.xml中添加如下配置,表示使用tomcat7:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>