场景:在添加日志时发现项目没有引用fastjson包,后来发现其实项目已经引用了,但是不是在所在模块引用的,于是看了下引用fastjson包的依赖,发现了 runtime
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.3</version>
<scope>runtime</scope>
</dependency>
一般来说,scope是比较少使用的,但是这个怎么这么不一般,查了相关资料,发现runtime实际上是在运行时时才进行编译,如果不是运行时时不会进行编译的。
例子说明jdbc的驱动适用了runtime的scope,是因为jdbc驱动本身是使用反射Class.forName来执行的,以为着如果程序不运行,编译jdbc驱动其实意义不大,而且编译这部分代码其实也会增大程序的开销,比如影响程序的每次编译时间,但是这样写需要相关的代码每次都是在运行时才被编译成class文件,所以会增加运行时程序的开销,对于不是动态生成的类是不能使用的。
fastjson源码中不涉及到动态生成代码,比如使用反射,动态代理。所以项目中使用runtime是不正确的。