0
点赞
收藏
分享

微信扫一扫

maven入门


本文可作为,孔浩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,别的就是回车

maven入门_Maven

依赖的作用域

compile,import,provided,runtime,system,test


import和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 

maven入门_ArtifactDescriptorEx_02

选择上force update of snapshots/releases 然后OK 即可






举报

相关推荐

0 条评论