美文网首页
providedt

providedt

作者: pq217 | 来源:发表于2022-04-02 18:05 被阅读0次

    前言

    首先二者都可以阻止依赖传递,很多人说二者只有语意上的区别,实际上还是有一些实在的区别的

    准备

    为了说明,我建了3个项目A,B,C,其中C依赖B,B依赖A(由于maven默认依赖是可传递的,所以C也依赖A)

    依赖关系

    一个项目建一个类,分别是A,B,C

    三个测试类

    其中B的代码:

    public class B {
        @Override
        public String toString() {
            return "B depends-on " + A.class; // 使用maven-a项目中的A类
        }
    }
    

    然后在B对A的引用上添加两种配置,实验二者的区别

    一致的效果

    首先不管用哪个,C类中都无法使用A,证明二者在阻止依赖传递上的功能是一致的
    当C类中调用B方法的toString(方法内部使用了A),如下

    public class C {
        public static void main(String[] args) {
            System.out.println(new B().toString());
        }
    }
    

    二者都会直接报错:找不到A

    不同的地方

    如果我们再B类中写一个main方法,并使用A类,二者的区别就出现了

    public static void main(String[] args) {
        System.out.println(A.class);
    }
    
    <scope>provided</..>

    首先使用<scope>provided</..>,运行main方法直接报错Exception in thread "main" java.lang.NoClassDefFoundError: A

    <optional>true</..>

    再试<optional>true</..>,发现正常输出class A

    总结

    optional=true:代表我有这个依赖,编译可以通过,并且我运行时也课时使用,但是依赖我的项目不能使用
    scope=provided:代表我有这个依赖,编译可以通过,但是运行时不能用,依赖我的项目更不能用

    如果两种方式分别打包,你会发现<scope>provided</..>时项目B的target只有B.class文件,而<optional>true</..>时,target目录下同时存在B.class和A.class

    所以有时候使用<scope>provided</..>方式时想写个main方法做个小测试,会发现报错java.lang.NoClassDefFoundError:

    相关文章

      网友评论

          本文标题:providedt

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