1. Maven 是什么
Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)[插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
简单描述下就是,Maven可以用来对项目进行管理,maven可以通过命名来构建项目的生命周期,并且能管理项目所用到的依赖
2. Maven用到的命令
mvn archetype:generate 创建Maven项目
mvn compile 编译源代码,例如生成class文件
mvn test 运行测试用例
mvn package 对项目进行打包
mvn install 生成jar包,并发布到本地仓库
mvn deploy 将jar发布到私有仓库上面
mvn clean 清楚编译好的项目
注意:2-6行每一个步骤都包括了前面步骤,这就是项目的生命周期
3. 安装maven
安装maven后可以自定义maven的本地仓库的路径,也就是jar包存放的地址,maven安装后的目录文件如下所示:
需要配置下conf目录下的settings.xml 并在其中更改默认的仓库地址,新的本地仓库地址在这个文件夹下新建一个叫做conf-set-repo的目录,把settings.xml复制到这个地方,并更改仓库地址。
这样做的好处是:可以配置不同的maven环境,也就是本地仓库不一样,在idea里面选择相应的文件即可。
4. Idea构建一个maven 项目
生成的目录结构如下:
配置阿里云镜像:
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
5. Maven 使用
1. Maven 坐标
<dependency>
<groupId>junit</groupId> # 组ID,一般用域名的相反排序,例如com.liam.blog
<artifactId>junit</artifactId> # 为依赖的标识,说明其用途
<version>4.11</version> # 版本一般是数字加文字,如1.0.0.RELEASE
<scope>test</scope> #依赖作用的生命周期,在测试的时候起作用
</dependency>
这样就可以通过这个依赖获得相应的jar包,并且这个jar包会放到配置的本地仓库中
2. Maven依赖管理
maven引入依赖就像左边如图所示,引入两个依赖,在右边就会有箭头指向的会依赖进来,在spring-webmvc
中还依赖了其他包,可以看到有6个其他依赖,每个依赖又有其他的依赖,这就叫做依赖传递。
3. Maven依赖冲突的解决
有了依赖传递,那么就可能会出现两个依赖会引用相同的jar包,但可能版本不一样,就会发生冲突,下面介绍几个解决冲突的方法:
- Maven 依赖调节原则
- 第一声明优先原则
如上图所示aop和webmvc都引入了springbean,但是看最终引入的却是5.3.4,这是因为aop的依赖是5.3.4,因为aop的依赖引入比webmvc靠前,如果想引入5.3.3的bean的话,就需要将webmvc放前面。
如下图所示:
-
路由优先原则
上图左边是项目最终引入的依赖,单独引入了5.3.2的bean之后,webmvc和aop引入的bean就会被覆盖,这是因为引入spring-beans是直接引入的,通过aop和webmvc引入是间接引入的,因此最终引入的是直接引入的spring-beans。
- 第一声明优先原则
-
排除依赖
可以通过:类似下列语句排除对应的依赖
<exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions>
-
版本锁定
版本锁定可以通过
来管理依赖的版本,在该标签中声明之后,后面对应的 引入对应的jar包的版本就会被固定,例如如下所示: <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.3.4</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> # 不用指定版本也可以,因为版本锁定了 </dependency> </dependencies>
注意通过
标签不会引入相应的jar包,只是固定对应版本。
3. maven 构建父子工程
-
不在同一个项目下的父子工程
- 在同一个项目下的父子工程(用的最多)
父工程pom.xml
<groupId>org.example</groupId> <artifactId>maven-test-parent1</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>maven-test-sub1</module> # 注意这个地方 ,用module来指定子模块 <module>maven-test-sub2</module> </modules>
子工程1 pom.xml
<parent> <artifactId>maven-test-parent1</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>maven-test-sub1</artifactId>
子工程2 pom.xml
<parent> <artifactId>maven-test-parent1</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>maven-test-sub2</artifactId>
上面的这些pom文件都是自动生成的
- 在同一个项目下的父子工程(用的最多)
6. 构建私服
本文在linux上配置,因为现在都是在远程服务器上配置,本地机器就不搞了
- jdk的配置
-
下载nexus的包并上传到服务器解压
链接: https://pan.baidu.com/s/1g_3TFyYUysvVevUsiipt2g 密码: ldck
- 启动nexus
- 先看下nexus文件中比较重要的东西
nexus.vmoptions:
-Xms2703m -Xmx2703m -XX:MaxDirectMemorySize=2703m -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=../sonatype-work/nexus3/log/jvm.log -XX:-OmitStackTraceInFastThrow -Djava.net.preferIPv4Stack=true -Dkaraf.home=. -Dkaraf.base=. -Dkaraf.etc=etc/karaf -Djava.util.logging.config.file=etc/karaf/java.util.logging.properties -Dkaraf.data=../sonatype-work/nexus3 -Dkaraf.log=../sonatype-work/nexus3/log -Djava.io.tmpdir=../sonatype-work/nexus3/tmp -Dkaraf.startLocalConsole=false
nexus-default.properties:
## DO NOT EDIT - CUSTOMIZATIONS BELONG IN data-dir/etc/nexus.properties ## # Jetty section application-port=8081 # 端口号 application-host=0.0.0.0 nexus-args={jetty.etc}/jetty.xml,{jetty.etc}/jetty-http.xml,{jetty.etc}/jetty-requestlog.xml nexus-context-path=/ # Nexus section nexus-edition=nexus-pro-edition nexus-features=\ nexus-pro-feature nexus.hazelcast.discovery.isEnabled=true
nexus常用命令
./nexus { console | start | stop | restart | status | dump }
- 启动nexus
进入到nexus的bin目录下 ./nexus start
访问 ip:8081即可登录到nexus,如下所示:
点击sign in 登录:
要输入用户名和密码,密码在/usr/local/nexus/sonatype-work/nexus3/admin.password
目录下
运行cat /usr/local/nexus/sonatype-work/nexus3/admin.password 即可得到密码登录
- 配置nexus
- 创建nexus 仓库
-
liam-release 的hosted类型的仓库
-
liam-snapshot 用于存放snapshot的jar,创建方式和上面一样,只是version policy选择snapshot
-
创建proxy类型的仓库
-
创建group类型的仓库
-
创建好的仓库
-
本地maven 连接私有仓库进行上传下载jar包
- 上传jar配置
maven的settings.xml配置 <server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server>
# 父项目pom.xml配置 <distributionManagement> <repository> <id>releases</id> # 和上面的id对应 <url>http://101.37.148.32:8081/repository/liam-release/</url> </repository> <snapshotRepository> <id>snapshots</id> <url>http://101.37.148.32:8081/repository/liam-snapshot/</url> </snapshotRepository> </distributionManagement>
可以看到上传成功了
-
下载jar配置
settings.xml 配置:
<server> <id>liam-group</id> #与下面mirror的id一致 <username>admin</username> <password>admin123</password> </server> <mirror> <id>liam-group</id> <name>my group</name> <url>http://101.37.148.32:8081/repository/liam-group/</url> <mirrorOf>*</mirrorOf> </mirror>
group仓库是空的,如果本地仓库是空的,那么会通过这个group去阿里云获取相应的jar包
删除原来配置的本地repository里面的jar包,并重新reimport下项目,可以看到下载会从私服下载
私服上的group上会有下载好的jar包,如下所示:
点击父项目的deploy后,会在liam-snapshot上出现我们打包好的jar包,当然也会在liam-group中(因为Liam-snapshot在Liam-group仓库组中)
- 上传jar配置
-
测试其他项目是否能从私服下载
- 创建nexus 仓库
-
额外解决的问题
解决方式
vim /etc/security/limits.conf 在最后一行添加 root - nofile 65536 vim /usr/local/nexus/nexus/bin/nexus.rc 改为 run_as_user="root" 重启linux ./nexus start // 稍等会即可
Default Admin Credentials
更改下admin密码就好
相关下载 :
- maven依赖下载
-
[nexus包下载](链接: https://pan.baidu.com/s/1g_3TFyYUysvVevUsiipt2g 密码: ldck)
-
jdk安装
yum install java-1.8.0-openjdk.x86_64
参考文章:
- maven阿里云仓库配置
-
注意是改为nexus - nofile 65536
文章评论