美文网首页
Maven Scope

Maven Scope

作者: UncleY_1924 | 来源:发表于2019-02-26 21:42 被阅读0次

    Maven Scope就是用来控制依赖和三种classpath(编译classpath,测试classpath、运行classpath)的关系,Maven有如下几种依赖范围:

    compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。典型的例子是spring-code,在编译、测试和运行的时候都需要使用该依赖。

    test: 测试依赖范围。使用次依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此依赖。典型的例子是Jnuit,它只有在编译测试代码及运行测试的时候才需要。

    provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时候无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器以及提供,就不需要Maven重复地引入一遍。

    Springboot
    从类SpringbootApplication启动时, 出现了如下错误

    Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpSession
        at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na]
        at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3167) ~[na:na]
        at java.base/java.lang.Class.getDeclaredMethods(Class.java:2310) ~[na:na]
        at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:668) ~[spring-core-5.1.5.RELEASE.jar:5.1.5.RELEASE]
        ... 25 common frames omitted
    Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpSession
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
        at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:148) ~[spring-boot-devtools-2.1.3.RELEASE.jar:2.1.3.RELEASE]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
        ... 29 common frames omitted
    

    但是在工程中引入该类对应的jar

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    

    原因就是因为这个privided scope

    <scope>provided</scope>
    

    导致运行classpath中该jar无效

    但是通过

    mvn spring-boot:run
    

    则可以正常运行(前提配置spring-boot-maven-plugin)
    因为该指令会将Springboot内置tomcat的jar都引入运行classpath

    相关文章

      网友评论

          本文标题:Maven Scope

          本文链接:https://www.haomeiwen.com/subject/vrttuqtx.html