Idea下运行找不到class、找不到jar包(provided test scope)
2018年04月08日


首先 应弄懂Maven的各种Scope,参见《Maven的5种scope》一文。


Eclipse和Idea两种IDE对于maven scope的运用不一样

    Eclipse它会把当前IDE下运行的代码,都当做test环境,所以当前IDE下直接运行程序,能够使用所有scope的jar包(包括test、system和provided)。

    但是Idea下就不行,idea下只有compile和runtime两种scope的jar才能在main/src下直接使用(在test/src下使用不受限制)。

    例如 main/src下面有个java程序的Main方法,eclipse直接按F11运行,所有scope的jar包都可以依赖到但是idea下面只有compile和runtime的jar包能用,其他provided、system和test的jar包都会报错——找不到class

    原因分析:Idea要运行main方法,必须先建一个run命令,要指定运行的java类以及jdk,执行时先将这个类编译成class,然后再运行。Eclipse可以不创建run命令和指定jdk,因为它可以智能识别当前程序,判断它的运行方式(Main运行或者junit运行等),然后使用workspace默认的jdk,所以Eclipse下面直接按F11就可以运行main方法,而且,Eclipse知道你是在当前IDE运行的,是想做测试,编译这个类时,它会按test类对待(无论是在 test/src下面,还是 main/src下面,只要是在当前IDE下运行,都视为test运行),所有scope的jar包都可以引用,Idea就比较坑——只有在 test/src 下的类,才能做test测试,main/src下面是引用不到 provided、system和test的jar包的。

    解决方案:将test类,写到 test/src下面,必要时,写两份,main/src和test/src下面都写。例如 spring boot的启动类,正常是写在 main/src下面的,Application.main(args),为了兼容Idea,要在 test/src 下面添加一个 RunTestApplication.main(args),在这个方法里面,调用 Application.main(args) 即可。