关于maven的jar包下找不到类的一种可能

来源:互联网 发布:java向数据库添加数据 编辑:程序博客网 时间:2024/05/18 13:27
</pre><pre name="code" class="java"><span style="font-size:14px;">严重: Exception starting filter jfinal-webjava.lang.NoClassDefFoundError: com/alibaba/druid/pool/DruidDataSourceat com.jfinal.plugin.druid.DruidPlugin.start(DruidPlugin.java:127)at com.jfinal.core.Config.startPlugins(Config.java:87)</span>


刚开始找不到这个类,很纠结,去找maven库是不是有问题,看到有是有jar包的,类名也是这个jar包里的

删除了jar包,重新拉了一遍,看了看jar包又出现了

一运行还是不行

于是想是不是版本的问题,但是这个比较难验证放弃

又看一下pom.xml

<pre name="code" class="java"><span style="font-size:14px;">    <dependency>        <groupId>com.alibaba</groupId>        <artifactId>druid</artifactId>        <version>1.0.26</version>        <scope>provided</scope>    </dependency></span>
发现了<scope>provided</scope>抱着试试的态度删了它,居然可以了
<span style="font-family:Arial, Helvetica, sans-serif;font-size:14px;">查了下</span>
<span style="font-family:Arial, Helvetica, sans-serif;"></span><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">其实这个问题很简单。</p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。</p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的liferay容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了。</p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;"> </p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">听起来很玄乎,对吧,其实一点也不难理解。举个scope=provided的例子。</p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">比如说,假定我们自己的项目ProjectABC 中有一个类叫C1,而这个C1中会import这个portal-impl的artifact中的类B1,那么在编译阶段,我们肯定需要这个B1,否则C1通不过编译,因为我们的scope设置为provided了,所以编译阶段起作用,所以C1正确的通过了编译。测试阶段类似,故忽略。</p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">那么最后我们要吧ProjectABC部署到Liferay服务器上了,这时候,我们到$liferay-tomcat-home\webapps\ROOT\WEB-INF\lib下发现,里面已经有了一个portal-impl.jar了,换句话说,容器已经提供了这个artifact对应的jar,所以,我们在运行阶段,这个C1类直接可以用容器提供的portal-impl.jar中的B1类,而不会出任何问题。</p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;"> </p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;"><span style="padding: 0px; margin: 0px;">实际插件的行为:</span></p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">刚才我们讲述的是理论部分,现在我们看下,实际插件在运行时候,是如何来区别对待scope=compile和scope=provided的情况的。</p><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; clear: both; height: auto; overflow: hidden; color: rgb(80, 80, 80); font-family: 宋体, 'Arial Narrow', arial, serif; font-size: 14px; line-height: 28px;">做一个实验就可以很容易发现,<span style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; background-color: rgb(255, 255, 255);">当我们用maven install生成最终的构件包ProjectABC.war后,在其下的WEB-INF/lib中,会包含我们被标注为scope=compile的构件的jar包,而不会包含我们被标注为scope=provided的构件的jar包。这也避免了此类构件当部署到目标容器后产生包依赖冲突。</span></span></p>

0 0
原创粉丝点击