SERVICE PHONE
发布时间:2022-08-18 02:35:21 点击量:
Maven,学习框架之前我们都会接触到的一个工具,感觉他的定位,似乎就跟git一样,只是方便我们开发?于是自然而然的,很多小猿对于Maven都只是停留在会用的阶段,利用他来构建,打包,引入jar包。 而实际上呢,Maven还有很多强大的地方,多模块开发,私服等等也是需要我们掌握的,在实际的开发中,往往是多模块共同开发,特别是我们之前提及的Dubbo分布式开发中,多模块开发是重中之重!
比如String的getByte方法,在两个系统上得到的结果是不一样的,如果没有重新编译运行,那最终也会有偏差
Project Object Model
提供一套自动化构建项目的方法.并且通用,兼容性好,跨平台
构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。 maven支持的构建包括有:
1.清理, 把之前项目编译的东西删除掉,我新的编译代码做准备。
2.编译, 把程序源代码编译为执行代码, java-class文件
3.测试, maven可以执行测试程序代码,验证你的功能是否正确。
4.报告, 生成测试结果的文件, 测试通过没有。
5.打包, 把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。
6.安装, 把5中生成的文件jar,war安装到本地仓库供别的文件使用
7.部署, 把程序安装好可以执行。
这些在下边的生命周期其实刚刚好体现出来
即能进行配置的不要去编码指定,能事先约定规则的不要去进行配置。这样既减轻了劳动力,也能防止出错。
先在本地仓库找,找不到就去私服找,如果私服没有,则会到中央仓库下载到私服并且发送到本地仓库
无论如何都还是最终会下到本地,区别只是从哪发送到本地而已?
对哪种仓库进行镜像
Maven工程目录结构
Maven构建命令使用mvn开头,后面加功能参数,可以一次执行多个命令,使用空格分隔
把编译的去掉,target文件目录删除掉
把你的当前项目安装到本地仓库,成为一个jar包供别的项目引用里边的类等
会先compile,然后再clean
?
依赖具有传递性,包括直接传递和间接传递。 直接传递:在当前项目中通过依赖配置建立的依赖关系(A使用B,A和B就是直接传递) 间接传递:如果A依赖B,而B依赖C,那么A和C之间就是间接传递
在越浅层的优先级越高
在同一层,先声明的比较高
后配置的覆盖前边的
<properties> <spring-boot.version>2.3.0.RELEASEspring-boot.version> <dubbo.version>2.7.8dubbo.version>properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-dependenciesartifactId> <version>${spring-boot.version}version> <type>pomtype> <scope>importscope> dependency> <dependency> <groupId>org.apache.dubbogroupId> <artifactId>dubbo-dependencies-bomartifactId> <version>${dubbo.version}version> <type>pomtype> <scope>importscope> dependency> dependencies>dependencyManagement><dependencies> <dependency> <groupId>org.apache.dubbogroupId> <artifactId>dubbo-spring-boot-starterartifactId> <version>2.7.8version> dependency> dependencies>复制代码
dependencyManagement
通过继承可以实现在子工程中沿用父工程中的配置(与Java类似)
?
<parent> <groupId> groupId> <artifactId> artifactId> <version> version> <relativePath>父工程pom文件地址relativePath>parent>复制代码
<parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.5.6version> <relativePath/> parent>复制代码
?
可以管理版本,解决子工程中依赖冲突问题(上文提及到的版本锁定)
?
<dependencyManagement> <dependencies> <dependency> <groupId> groupId> <artifactId> artifactId> <version> version> dependency> dependencies>dependencyManagement>复制代码
?
继承依赖使用:在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本 ?
<dependencies> <dependency> <groupId> groupId> <artifactId> artifactId> dependency>dependencies>复制代码
?
<packaging>pompackaging>复制代码
保存那些无法从中央仓库直接获取的资源,比如说我们自己研发的一些项目,或者一些第三方非开源项目比如oracle(要注意版权问题)
有时候我们是多台机器开发,而我们要去引用别人机器上的模块jar包时,这个时候对方单纯install也只是发布到对方电脑上的本地仓库而已,我们还是访问不到.这个时候就需要一个中间商私服,来存放一些需要共享的资源
把这一项改为false , 才可以用root用户开启nexus
账号默认是admin
初次登录会提示你去特定位置找密码
在该目录下寻找即可
之后可以修改默认密码
需要配置两个地方
?
?
上传jar包需要认证,maven的认证是在.m2/settings.xml或自己的的maven里settings.xml中servers标签下配置的.
这里特别说明一下,servers配置的ID很关键,这个与你项目里面的distrubtionManagement下配置的仓库ID一致,否则会报审核未通过的错误。
<server> <id>nexus-Meloid> <username>adminusername> <password>adminpassword> server> <server> <id>Melo-Releaseid> <username>adminusername> <password>adminpassword> server> <server> <id>Melo-Snapshotsid> <username>adminusername> <password>adminpassword> server>复制代码
这里的id对应了setting.xml里配置的server.id信息,name任取
<distributionManagement> <repository> <id>Melo-Releaseid> <url>http://ip地址:端口/repository/Melo-Release/url> repository> <snapshotRepository> <id>Melo-Snapshotsid> <url>http://ip地址:端口/repository/Melo-Snapshot/url> snapshotRepository> distributionManagement>复制代码
建议使用自带的maven-public仓库组 , 然后把我们自己创建的仓库包含进去
除非自己去手动改proxy代理的仓库地址,但个人感觉不太推荐,具体见后文"另外的实现方式"
包含拉取和上传的两部分配置,两部分都需要权限
<server> <id>nexus-Meloid> <username>你的私服账号username> <password>你的私服密码password> server> <server> <id>Melo-Releaseid> <username>你的私服账号username> <password>你的私服密码password> server> <server> <id>Melo-Snapshotsid> <username>你的私服账号username> <password>你的私服密码password> server>复制代码
<mirror> <id>alimavenid> <name>aliyun mavenname> <url>http://maven.aliyun.com/nexus/content/groups/public/url> <mirrorOf>centralmirrorOf> mirror> <mirror> <id>nexus-Meloid> <name>nexus-Meloname> <mirrorOf>!centralmirrorOf> <url>http://ip地址:端口/repository/maven-public/url> mirror>复制代码
*表示所有 !表示非
,!repo1 : 在除了repo1的仓库中寻找
external: : 刚好跟上边的 !internal.repo,* 相反
?
正确的操作是在profiles节点下配置多个profile,而且配置之后要激活!!!!
<profile> <id>aliyunid> <repositories> <repository> <id>aliyunid> <url>http://maven.aliyun.com/nexus/content/groups/public/url> <releases> <enabled>trueenabled> releases> <snapshots> <enabled>trueenabled> <updatePolicy>alwaysupdatePolicy> snapshots> repository> repositories> profile> <profile> <id>nexus-prid> <repositories> <repository> <id>nexus-Meloid> <name>nexus-Meloname> <url>http://ip地址:端口/repository/maven-public/url> <layout>defaultlayout> <releases> <enabled>trueenabled> releases> <snapshots> <enabled>trueenabled> snapshots> repository> repositories> profile>复制代码
<activeProfile>aliyunactiveProfile> <activeProfile>nexus-practiveProfile> <activeProfile>jdk-1.8activeProfile>复制代码
那些中央仓库有的文件,就会走阿里云镜像去下载,如果是我们自定义的jar包(中央仓库没有的),就会走我们的私服去下载!
maven这一块,具体的聚合,继承实例,等到真正运用上了分布式开发的时候,应该会有所渗透。而私服的运用,在多台机器上是十分重要的!
作者:Melo_
链接:
https://juejin.cn/post/7024062242060501029