idea引入jar包的姿势

/ ARC / 没有评论 / 150浏览

idea引入jar包的姿势

欢迎关注微信公众号:程序员小圈圈
原文首发于:www.zhangruibin.com
本文出自于:RebornChang的博客
转载请标明出处^_^

为什么要写这篇文章呢,因为笔者这段时间项目上的确遇到了这个个小问题大神略过本篇即可。

以前使用eclipse的时候,引入外部的jar包直接在lib下面引用就行了,如果项目结构简单,那就更简单了。

但是在idea中,还是有那么些区别的。

先说下笔者的项目结构,如下图所示 红色框圈住的是war包形式,剩下的几个子模块是以jar包的形式为三个war包所依赖。那现在就有这么一件事,我要在service里面引用一个外部jar调用jar里面的功能,那么怎么引入呢? 笔者来说说自己是怎么做的。 1.先把外部jar文件直接复制粘贴到service的resource/lib目录下,然后代码可以正常编写和引入。 但是,等运行的时候,问题来了,提示编译的时候不通过,找不到对应的war包,那怎么办?设置下war包的路径吧。 如下图所示: 然后,在service里面指定一下打包时要打包的插件目录:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.0</version>
    <configuration>
        <source>${jdk.version}</source>
        <target>${jdk.version}</target>
        <encoding>UTF-8</encoding>
        <showWarnings>true</showWarnings>
        <compilerArguments>
            <extdirs>${basedir}/src/main/resources/lib</extdirs>
            <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>

这么操作之后,使用war explode包本地运行项目的确可以了。

2.本地运行可以了,那打到生产上去试试吧,不好意思,按照上面那么操作的话,如果直接使用idea的install打包的话,是会报编译不通过的,那怎么办? 有下面几种方法挨个去试: 2.1 清理缓存,重新打开项目,然后rebuild对应的war包; 2.2 找到对应的编译未通过的类的子模块,然后重新编译; 2.3 解析一下依赖,看看是不是依赖冲突了。

笔者经过上面一系列操作,终于可以达成war包了,然后就扔服务器上试试吧,然而,服务器上运行war包后,调用那块代码的时候效果如下: 3.从上面那张图我们可以看到,报的错是NoClassDefFindError,注意,不是ClassNotFoundError,这两者是有很大区别的,既然是NoClassDefFindError,那意味着其实能找到这个类,但是加载的时候出问题了,也就是说,引入的jar包,在编译执行的时候不能被加载,那,拿下来扔到服务器上的war包解压来看看,直接看war包的WEB-INF/lib目录,发现问题了,虽然在pom中指定了打包jar目录,但是打包的时候没有把引入的jar打进来,但是,着急发版,不能去仔细排查问题了,那怎么办?粗暴点,直接把要引入的jar文件,放到war包里面的WEB-INF/lib目录,然后重新扔回去试验,可以正常运行。那就简单了,也就是说,要在打成war包的时候,外部引入的jar必须 在WEB-INF/lib目录里面,OK,那就这样,直接在war包的WEB-INF/lib目录把这个jar扔进去,完事。