且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Maven使用笔记(二)Eclipse中maven项目添加依赖

更新时间:2022-05-31 23:00:00

1.在Eclipse中创建Eclipse项目后如何添加jar包?

点击pom.xml文件.我们可以看到下面有7个标签。

Maven使用笔记(二)Eclipse中maven项目添加依赖

各个标签的含义如下:

Overview:显示maven项目的一些基本信息
Dependencies:添加jar包的页面
Plugins:添加maven插件的页面.比如tomcat-maven-plugin等
Dependency Hierarchy:用于显示jar包的依赖关系.没事的时候可以看看jar包的依赖关系
Effective POM:显示maven的编译路径,plugin之类的.也可以无视
pom.xml:导入jar包的信息,可以在其中进行修改

现在添加jar包:
点击Dependencies标签页
点击Dependencies中的add按钮 

Maven使用笔记(二)Eclipse中maven项目添加依赖

搜索mongodb,显示如下图

Maven使用笔记(二)Eclipse中maven项目添加依赖 

其中Scope的选择,默认compile即可。

对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。
而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的liferay容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了。

添加完成后,在Dependencies页签可以进行管理,包括调整版本号等。

Maven使用笔记(二)Eclipse中maven项目添加依赖

type表示依赖包的类型. 
Scope表示这个依赖包的作用周期. 
这些我们暂时不理会. 
保存后.如果是第一次安装maven,可能会有一段长时间的jar包下载过程. 
只要第一次把jar包下载到本地后就不需要下载了. 
maven默认的jar包下载地址在C盘 -->用户-->%User%-->.m2中 

maven会把和添加的jar包有依赖关系的全部下载下来.这样就避免了jar包缺失的问题了。

比如添加Spring-mvc相关的jar包,
maven下载完jar包后,点开项目中的Maven Dependencies,项目会下载很多jar包。

多的这些包其实是和spring-context包有依赖关系的包。

Maven使用笔记(二)Eclipse中maven项目添加依赖 


2.未使用Maven,出现服务器Jar包冲突的解决

在开发测试时正常, 一旦部署到正式服务器上, 如果出现以下几类异常,很可能是存在jar包冲突:

1, java类找不到 java.lang.ClassNotFoundException
2, 方法不存在 java.lang.NoSuchMethodError
3, 字段不存在 java.lang.NoSuchFieldError
4, 类错误 java.lang.LinkageError
 
war包中jar包和服务器上jar包冲突, 由于现在服务器功能越来越强大, 而引入的jar也在不断增加, 
出现的冲突的可能性也越来越大, 而且正式环境复杂, 而且不能轻易修改服务器相关配置, 
为解决jar包冲突的问题带来困难, 如果去解决过这些问题, 那是相当折腾人的, 下面是一些方法的总结.

产生冲突的原因: 
这类冲突根本原因就是: 同一个java类存在多个jar包或类路径中, 而这大多由于使用了不同jar包版本造成.
 
下面的办法整理自网上资源,其实正确的使用Maven可以很好的避免这种情况的发生。

解决办法:

1, 案例法 
使用服务器上已有应用的jar包(前提:服务器上面已经部署过别的应用), 曾经使用过此方法解决冲突

2, 最小化法 
正式环境有很多限制, 上传,部署,启停,测试这些过程越简单越好, 最近一次把war包中137jar删除只剩下14个jar包, 
整个测试验证周期大大缩短

3, 来源法 
如果能知道类加载于哪个jar包, 解决就比较容易, 在异常中会有出错类的完整类名, 
如果能获取此类加载于那个jar包, 就能确认冲突的jar包,
如何知道class加载于那个jar包, 昨天灵机一动想到了一个方法, 其实也很简单, 代码如下:
1
clazz.getResource("className.class").toString();

  

4, 服务器分析法
了解各种应用服务器的class加载机制, 就能判断是什么原因, 什么时候导致的冲突, 这样可以通过调整class加载顺序解决, 
最近一次WAS服务器上的jar包冲突就此方法解决.
 

3.tomcat类加载顺序

Tomcat下的文件目录 
/bin:存放启动和关闭tomcat的脚本文件; 
/conf:存放tomcat的各种配置文件,比如:server.xml 
/server/lib:存放tomcat服务器所需要的各种jar文件(jar文件只可被tomcat 服务器访问) 
/server/webapps:存放tomcat自带的两个web应用:admin应用和manager应用。 
/common/lib:存放tomcat服务器以及所有web应用都可以访问的jar文件夹(web和tomcat服务器都可访问此jar) 
/shared/lib:存放web都可访问的jar文件。(可以被所有的web访问,但不能被tomcat访问) 
/logs:存放tomcat的日志文件 
/webapps:当发布web应用时,默认情况下把web应用文件放于此目录下 
/work:tomcat把由jsp生成的Servlet放于此目录 

另:在web应用中,WEB-Inf目录下,也可以建立lib子目录,在此子目录下可以存放各种jar文件,这些jar文件只能被当前web应用访问。其中,在web-inf目录下的lib与classes目录,Tomcat类装载器先装载classes目录下的类,再装载lib目录下的类。因为类同名时,classes优先。 

其中jsp运行时,查找class的顺序为:项目文件夹(WEB-INF\lib)—>容器文件夹(tomcat\common\lib)—>jdk文件夹(jdk\jre\lib\ext) 
Tomcat是一种向上寻找的层次结构,也有向下的,或者是可配置的。