详解IDEA使用Maven项目不能加入本地Jar包的解决方法
使用IDEA编辑Web项目已经逐渐超过了使用eclipse的人数,但是IDEA对于pom.xml的执行也就是Maven方式导包支持并不是很完善,简单来说就是pom.xml上面记录的依赖库一般都能导入,但是如果pom.xml上面的某个依赖库失效,比如远程服务器关闭或者网络不通,或者是你想要加入本地硬盘上的某个jar包而不修改pom.xml的时候,IDEA的弊端就会显现出来。主要表现就是无法获得的依赖库或者本地Jar包无法放到/WEB-INF/lib目录下,导致Web项目部署时报错。
一个常见的错误就是ojdbc8,也就是连接Oracle数据库12c所需的最新的jdbc驱动包,这个在maven网站上是可以搜索到的,如下http://mvnrepository.com/artifact/com.github.noraui/ojdbc8/12.2.0.1
给出的依赖库网络路径为
<!-- https://mvnrepository.com/artifact/com.github.noraui/ojdbc8 --> <dependency> <groupId>com.github.noraui</groupId> <artifactId>ojdbc8</artifactId> <version>12.2.0.1</version> </dependency>
然而这个路径在2015年还有效,在2018年已经连接不上了(目前唯一还有效的是ojdbc for java 1.4的版本,2015年,无法支持oracle 10g及以后的数据库),如果你在maven里这样配置,那么IDEA的models里就会告诉你找不到该依赖库,当然你的WEB-INF里面也就不会有jdbc的jar包,你的应用当然就连接不了数据库了
IDEA会贴心的在相关maven依赖库下面加波浪线,并且把无法加载的资源用红色表示。
如果此时我们手动向Libraries里面加入本地的Jar包可不可以呢?
能加当然是能加进去,不过根据我多次的反复实验发现,你加入到Project Structure里面的Models或者Libraries里面之后,编写代码的时候是可以找到依赖的,但是在打war包的时候还是不会把ojdbc加入进去的,所以还是没能达到我们想要的效果。这主要是因为IDEA只会把pom.xml里面记录的jar包放入到WEB-INF,而不会理睬你其他方式加入的jar包。所以我们最后还得从maven入手。
此时我们就需要在上图出现问题的地方找到标红色的Classes下面的路径,通过手动点击来修改成本地jar包的位置,并且应该变为绿色,如下
这样IDEA就不会把这个maven源报错了,同时pom.xml并没有被修改,只是项目目录下.idea目录下的某个.iml被修改了,这个修改要好好保留,因为不知道什么时候你一编译就又会按照pom.xml再给你改回来。如果需要长期不让它报错,可以使用cmd命令把本地的jar包加入到本地maven库中,命令如下:(把当前目录下的ojdbc8.jar按照上面的pom.xml中的配置加入到本地maven源)
mvn install:install-file -Dfile=ojdbc8.jar -DgroupId=com.github.noraui -DartifactId=ojdbc8 -Dversion=12.2.0.1 -Dpackaging=jar
另外如果不把maven里面自己设置的jar包输出到web根目录lib文件夹的话,那么打出来的war包或者是放在tomcat里跑还是会在启动的时候报错,如下就是使用了HttpClient也在maven里加入了HttpClient的依赖,但是启动tomcat仍然报错找不到类,此时你需要按照tomcat的一贯套路把相关jar包放到web根目录的lib目录下
此时还是进入Project Structure,在左侧找到Artifacts,然后找到WEB-INF,新建一个lib目录,然后点击加号把相关的库引入
加完之后
只有这样,打出来的war包的WEB根目录下才会有lib文件夹和里面的相关依赖jar包
如果你发现修改了这里还没有把自定义的jar包打包到WEB-INF下面(只是在代码窗口里不报错了),一个可能性是在编译过程中刚刚的修改又被pom.xml给覆盖了,另一个原因可能是你没有把编译结果输出到待发布目录,通过下面的方式可以修改。
后记:在没有使用maven框架的时候,java文件和包是可以直接放在src目录下的,但是引入maven之后,IDEA会自动帮你吧原来src下的包迁移到src/main/java下面,同时建立src/main/resources目录,这里面一般放我们的log4j配置文件log4j.properties。
在没有maven框架的时候,log4j.propertise应该放在src下面才能被自动识别,而加入maven框架之后应该放在src/main/resources下,否则log4j找不到默认配置文件
如下:在不使用maven框架时的目录结构,所有jar包都是放在项目根目录下
使用maven后的目录结构,没有jar包了,以pom.xml进行引入
另外还需要注意的一点就是,对于pom.xml里面和idea里面均有多出设置JDK版本的地方,最好统一,否则无法build成功,首先是pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <groupId>groupId</groupId> <artifactId>XDphone</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.51</version> </dependency> ...... </dependencies> </project>
然后是项目代码风格
然后是编译器版本在File-Settings里面
这样就能避免internal compiler error了