maven项目启动、访问的两个问题

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的值可以为以下几个:

  1. compile:默认值,也就是不声明scope标签,表示被导入的jar包参与当前项目的编译、测试、运行、打包。这是一个作用比较强的依赖;
  2. test:表示被导入jar包仅仅是参与测试工作,比如Junit包;
  3. runtime:表示被导入jar包不参与编译、参与测试、运行;
  4. 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>
原文地址:https://www.cnblogs.com/zhuobo/p/10878106.html