本文可作为,孔浩maven课程的学习笔记
下载,安装
自己去看看
mvn基本概念
使用groupId,artifactId,version三个只来指定一个项目例如
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>9.0.0.M4</version>
</dependency>
groupId一般是公司名称.项目名称
artifactId一般是就是上面那个大项目的子项目名称
version就是x.x.x-里程碑
里程碑包括
SNAPSHOT(程序员正在开发的版本)
alpha(程序员内部测试的版本)
beta(用户测试版本)
Release(RC 正式发布版)
GA(General Availability 广泛可用,官方推荐的使用版本)
在maven中一般用的是SNAPSHOT或者release
mvn 常用命令汇总
mvn compile
会在src的同级目录下生成target/classes
mvn test
会在src的同级目录下生成target/test-classes,target/surefire,target/surefire-report
mvn clean
删除target文件夹
mvn package 是打成jar
mvn install 是打成jar,并且把jar放到仓库里(本机的仓库)
mvn archetype:generate 就是产生一个maven项目
如果是第一次运行这个命令,首先会下载很多相关文件
然后列出项目模板...
然后进入互动界面
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): xxx
会默认给出一个项目模板(所以直接回车即可)
然后选择对应的项目模板的版本号(一般会默认给出,直接回车即可)
选择groupId,artifactId,version等等
然后回默认指定package,此时直接回车即可
如下图,comfirm properties configuration下需要键入y,别的就是回车
依赖的作用域
compile,import,provided,runtime,system,testimport和system暂且不说
compile 编译的时候就把依赖加入,打包的时候也会加入
provided 编译和测试的时候会加入,打包的时候不会加入 例如tomcat的lib下那些jar
runtime 运行是依赖,编译的时候不会加入 例如myslq的连接包
test 只在test的时候加入,编译和打包的时候不要 例如junit
compile是maven默认的
依赖传递
如果项目A->spring-bean-2.2.3.jar如果项目B->spring-bean-2.2.4.jar
项目C->A,B
那么项目c内加入的就会是spring-bean-2.2.3.jar
为什么?
因为在pom.xml里先写的是A#
如果项目A1->A2->spring-bean-2.2.3.jar
如果项目B->spring-bean-2.2.4.jar
项目C->A,B
那么项目c内加入的就会是spring-bean-2.2.4.jar
为什么?
因为从c到spring-bean-2.2.4.jar比从c到spring-bean-2.2.3.jar的距离短
依赖排除
如果我不想使用spring-bean-2.2.4.jar怎么办?
在项目c里引用b的时候加上
<dependency>
<groupId>com.dlf</groupId>
<artifactId>B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>spring-framework</groupId>
<artifactId>spring-bean</artifactId>
</exclusion>
</exclusions>
</dependency>
另外maven dependency 里面有个optional选项
默认为false
项目b的pom中引用了组件c,且c的optional是false 那么如果项目a引用项目b的时候 也会默认的把组件c加上
如果b的pom中引用了组件c,且c的optional是true 那么如果项目a引用项目b的时候 就不会引用组件c 如果还需要组件c 那么只能多加一个dependency
项目聚合
如果一个大的项目分成了10个模块,我要package一下,岂不是要依次点击10个模块?我们可以使用maven带有的聚合功能
我们在eclipse里新建一个maven工程,packaging选择pom
在新项目的pom.xml的project下加入:
<modules>
<!-- 聚合 是模块的位置-->
<module>../user-core</module>
<module>../user-service</module>
</modules>
然后对这个工程的test compile都会依次对它所聚合的项目进行test,compile
项目继承
在子项目里写下<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 继承的绝对路径是 pom的文件-->
<relativePath>../user-parent/pom.xml</relativePath>
</parent>
这样一来,父项目的gruopid和一些常量就能在子项目中不经声明而使用
同时,可以在父项目里把子项目需要的jar包都写入
例如
<dependencyManagement>
<dependencies>
<dependency>
</dependency>
</dependencies>
</dependencyManagement>
子项目的pom的dependency就不需要写
version和scope了
另外再说明一下
在父项目里
直接写
<dependencies>
<dependency>
</dependency>
</dependencies>
子项目也会默认加载父项目所依赖的jar
如果是dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
</dependency>
</dependencies>
</dependencyManagement>
那么需要在子项目里显式的加入dependency
那父项目的dependencyManagement到底干了什么事呢?
统一了项目中依赖的外部组件的版本
另外如果myeclipse报这错误
ArtifactDescriptorException: Failed to read artifact descriptor for com.alibaba:druid:jar:0.2.23: ArtifactResolutionException: Failure to transfer com.alibaba:druid:pom:0.2.23 from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact com.alibaba:druid:pom:0.2.23 from/to central (http://repo1.maven.org/maven2): The operation was cancelled.
项目右键-->Maven4MyEclipse-->update project Configuration
选择上force update of snapshots/releases 然后OK 即可