m2e(maven integration for eclipse)理解

M2e :maven integration for eclipse - M2Eclipse | M2Eclipse

首先要理解maven和m2e是两个不同的东西。maven可以认为是一种exe执行程序,如下图所示。M2e则是一个eclipse插件,有了m2e可以在eclipse中使用maven。

maven的使用方式是项目编写完了之后,在cmd中输入maven命令(clean package install等)进行编译。

但是现在的开发都是使用IDE,所以最好是能在eclispe中通过可视化的方式使用maven,于是就有了m2e的出现。M2e本质上是基于maven,然后封装了一层UI,所以m2e需要知道maven的路径。从下图中可以看到eclipse有一个内置的maven-embedded,但是如果本地环境中安装了maven,建议将默认改为本地安装的maven,以防出现cmd执行和eclipse执行不一致的情况。

Eclipse中maven项目的编译

Eclipse可以基于classpath实时编译给出类似于下图的这种bug。

Maven具有编译项目的能力,eclipse本身也具有编译项目的能力。那么对于eclipse的maven项目,实时编译过程是怎样的呢。有两种可能性,一种是eclipse在进行编译时调用maven的编译接口直接使用maven编译器编译;另一种是eclipse在进行编译时调用maven的依赖接口获取pom中的依赖,使用eclipse编译器编译。实际上eclipse在实时编译的时候使用的是后一种策略。这两种的编译策略其实结果并不一定是一致的,在下一节的例子中就会不一致。

注意,上述的编译指的是编写代码时的实时编译,而非run as maven install时候的编译。

Eclipse中maven项目的classpath

在没有maven之前,我们都是通过import导入jar包;现在有了maven,我们又可以通过pom来引入jar包了。那么我们可不可以同时两种方法都使用?答案是肯定的

通过maven引入的jar包在maven dependencies的目录下,通过import导入的则出现在reference library中。随后又出现一个问题,当出现如上图所示的log4j包冲突时,哪个log4j包会生效?观察下图,就会发现一个项目的目录的结构的先后顺序其实并不是很任意的排列的,甚至是可以配置的。对这些顺序进行调整,会影响classloader的加载顺序,越前面的jar包里面的类会被优先使用,所以对于log4j的冲突,排在前面的1.2.17版本会被优先使用。

对于这种混合导入jar包的讨论仅是为了帮助理解eclipse的classpath管理机制,以及说明classloader对于jar包顺序的敏感性(不同的jar包顺序,可能会导致程序出现不同的行为)。在实际的应用过程中要避免这种混合导入,因为会出现eclipse编译和maven编译的不一致现象。

猜你喜欢

转载自blog.csdn.net/btb0815/article/details/82426313