Maven学习

29 阅读5分钟

一. Maven下载

maven官网

maven.apache.org

maven仓库

mvnrepository.com

1.打开maven官网,点击"download"

image.png

2.下载最新版本(如果下载其他版本可以跳过第2步,看第3步)

image.png

3.点击"Maven 3 achieves"

image.png

4.点击对应的版本,然后点击"binaries"

image.png

image.png

二.配置Maven

1.将maven的bin目录配置在path下

image.png

image.png

2.打开cmd,输入命令mvn -v 如果可以看到maven版本证明安装成功

image.png

三.Maven仓库分类

1.本地仓库:开发者本地已经下载下来的或者自己打包所有jar包的依赖仓库,可以在maven的setting.xml中修改

image.png

image.png

2.中央仓库:maven默认下载的仓库地址,是maven维护的

2.1配置中央仓库镜像

image.png

<mirror>        
		<id>nexus-aliyun</id>        
		<name>Nexus aliyun</name>                			
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>        
		<mirrorOf>central</mirrorOf>    
  </mirror>

因为中央仓库地址在国外,每次下载对应的jar包会比较慢,所以这里配置一个aliyun的镜像.这里的注意的是mirrorOf标签里面的值,要么就是"*",要么就是超级pom的id

超级pom位置:

2.1.1 解压那个maven-model-buidler-3.6.1.jar(不同的maven的版本可能不同)

image.png

2.1.2 org/maven/model/pom-4.0.0.xml文件

image.png

image.png

3.私有仓库(Nexus):可以理解为自己公司的仓库,也叫Nexus私服

四.Idea和Maven绑定

1.点击"setting"

image.png

2.依次点击

image.png

3.配置好各个路径

image.png

五.Maven依赖管理

1.maven依赖传递

我们项目通常需要依赖第三方组件,而第三方组件又会依赖其他组件,这种情况下maven会把依赖网络中的所有节点都依赖进来.比如:

image.png

image.png

2.maven依赖优先原则

因为整个maven网络比较复杂,所以可能会存在版本问题,这时就会有优先原则

原则一: 路径最短优先(图中的core是通过spring-webmvc依赖而依赖进来的,我们可以直接在pom.xml中通过dependency标签依赖,这样路径就会在前面)

原则二: 在路径相同的情况下,配置在前的优先

3.maven可选依赖

如果可选依赖设置为true,那么不会被依赖传递.举个例子

如果project-A依赖了project-B,并且在依赖project-B的同时设置了optional为true,那么这时如果project-X来依赖project-A的话,optional就会生效,project-B就不会发生依赖传递,这时project-X就依赖不到project-B了.

user模块

image.png

login模块

image.png

order模块

image.png

可以看出,图中login模块依赖了user模块,同时在依赖user模块的时候设置了optional为true,那么order模块依赖login模块的时候就依赖不到user模块了.

image.png

可以看到user模块有fastjson,login模块里面有fastjson,而因为order模块依赖不到user模块,所以没有fastjson.

4.排除依赖

可以排除部分依赖,以免发生版本冲突问题

login模块

image.png

order模块

image.png

image.png

对比显然可以看到因为用了排除依赖,order比login模块少了spring-core和spring-context

5.依赖范围

部分依赖在打包的时候没有必要打包,所以可以选择依赖的一个范围,依赖范围用scope标签,值在下图.

image.png

六. 项目聚合

image.png

可以看到一个shopDemo项目分了好几个模块,有user模块,有login模块,有order模块,我们只需要在每一个模块里面把不同的功能做好即可,如果对应功能的修改,只需进入到对应模块去修改即可,这样便于我们分工和管理.

6.1 继承

login模块,user模块,order模块都是shopDemo的子模块,那么他们都可以继承父亲(shopDemo)的属性,依赖,插件.

6.2 子工程与父工程依赖

因为父工程的pom文件中只要有一个依赖,子文件就会自动依赖过去.有的时候并不需要这个依赖,那么我们可以设置一下,只有子工程需要的时候引用.

父工程

image.png

login模块

image.png

image.png

父工程引入了一个mybatis依赖,所以所有的子模块(login,user,order)都会引入mybatis依赖,但是父工程中的mysql-connector-java的依赖在dependencyManagement标签里面,子模块不会自动引入了,只有像login模块一样手动引入才会引入依赖.

6.3 引用属性

image.png

image.png

七 maven常用命令

clean : 删除target目录

compile: 编译项目

package: 打包项目

install: 生成安装包放到本地仓库,同时会打包项目放到target下

八 maven和Nexus

1.下载并解压Nexus包

image.png

2. 启动Nexus服务器

必须以管理员身份运行cmd:(win+r,然后ctrl+shift+Enter进入管理员)

nexus.exe /install 安装nexus服务

nexus.exe /start 启动nexus服务

nexus.exe /stop 停止nexus服务

3. 进入Nexus

3.1 查看Nexus对应端口

image.png

image.png

3.2 根据Nexus端口拼接Nexus的url

image.png

3.3 找到对应的账号密码

账号: admin

密码: nexus-3.38.1-01-win64\sonatype-work\nexus3\admin.password文件里面就是的

4. Nexus仓库分类

hosted(宿主仓库): 存放公司开发的jar包(正式版本,测试版本)

proxy(代理仓库): 代理中央仓库,Apache下测试版本的Jar包

group(组仓库): 包含hosted和proxy

5. 将自己项目上传到Nexus

5.1 在maven的setting.xml文件中配置账号密码

image.png

   <server>
        <id>nexus-releases</id>
        <username>admin</username>
        <password>admin</password>
    </server>
    <server>
        <id>nexus-snapshots</id>
        <username>admin</username>
        <password>admin</password>
    </server>

5.2 在对应project或者对应模块的pom.xml里面添加

image.png

<distributionManagement>
    <repository>
        <id>nexus-releases</id>
        <name>User Project Release</name>
        <url>http://localhost:8081/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-snapshots</id>
        <name>User Project SNAPSHOTS</name>
        <url>http://localhost:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

5.3 点击deploy

image.png

代码上传会根据自己pom.xml里面的id去maven中setting.xml中找对应的id,拿到对应的账号密码,然后上传到对应的仓库里面

6. 从Nexus下载jar包

在对应模块里面添加配置

image.png

<repositories>
    <!-- 配置nexus远程仓库 -->
    <repository>
        <id>nexus</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://localhost:8081/repository/maven-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

如果想要整个项目所有都去Nexus下载jar包,可以在maven中的setting.xml配置

image.png

  <mirror>      
    <id>nexus</id>      
    <mirrorOf>*</mirrorOf>
    <url>http://127.0.0.1:8181/repository/maven-public/</url>   
</mirror>
7. Nexus中hosted中releases和snapshots区别

releases(正式版): 当我们的project经历了各种开发,测试,确认万无一失,可以准备上线了,可以把代码上传到releases这里

snapshots(测试版 or 快照版): 我们的代码遇到各种bug可能会随时修改,那么我们需要上传到snapshots这里,方便修改.

还有一个小细节: 如果我们修改了代码上传到snapshots里面,这里就会有不同的版本,我们如果要从Nexus里面去拉代码或者jar包会拉取最新的.但是如果是上传到releases中,我们必须手动修改version标签,才可以把最新的版本上传到releases里面去.