Maven,学习框架之前我们都会接触到的一个工具,感觉他的定位,似乎就跟git一样,只是方便我们开发?于是自然而然的,很多小猿对于Maven都只是停留在会用的阶段,利用他来构建,打包,引入jar包。 而实际上呢,Maven还有很多强大的地方,多模块开发,私服等等也是需要我们掌握的,在实际的开发中,往往是多模块共同开发,特别是我们之前提及的Dubbo分布式开发中,多模块开发是重中之重!
传统项目开发导jar包既然是导jar包,我们是在本地windows开发,而实际项目是要放到linux服务器上,如果我们单纯把项目打成jar包丢上去,依赖文件也是jar包,但两个系统因为环境不一样,直接丢jar包(他不会重新编译运行的),得出来的结果可能就不一样比如String的getByte方法,在两个系统上得到的结果是不一样的,如果没有重新编译运行,那最终也会有偏差
Maven概念POMProject Object Model
把每个项目看成一个对象来进行管理 Maven作用项目构建和管理提供一套自动化构建项目的方法.并且通用,兼容性好,跨平台
包括打包,编译,测试,运行等一套操作下来,让你在开发环境也可以方便进行测试等功能构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。 maven支持的构建包括有:1.清理, 把之前项目编译的东西删除掉,我新的编译代码做准备。2.编译, 把程序源代码编译为执行代码, java-class文件
批量的,maven可以同时把成千上百的文件编译为class。javac 不一样,javac一次编译一个文件。3.测试, maven可以执行测试程序代码,验证你的功能是否正确。4.报告, 生成测试结果的文件, 测试通过没有。5.打包, 把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。
这个压缩文件就是项目的结果文件, 通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war6.安装, 把5中生成的文件jar,war安装到本地仓库供别的文件使用7.部署, 把程序安装好可以执行。
这些在下边的生命周期其实刚刚好体现出来
依赖管理处理jar包冲突问题统一开发结构--约定大于配置即能进行配置的不要去编码指定,能事先约定规则的不要去进行配置。这样既减轻了劳动力,也能防止出错。
实际上maven并没有强行要求约束我们项目的文件结构,而是因为他做得好,自然而然就变成一种通用的结构了坐标 仓库 私服(下文中会有具体实例 下载顺序??先在本地仓库找,找不到就去私服找,如果私服没有,则会到中央仓库下载到私服并且发送到本地仓库
无论如何都还是最终会下到本地,区别只是从哪发送到本地而已?
此处有点疑问,私服没有会去中央仓库下到私服吗?我下边配置了阿里云和私服,似乎私服没有的话是直接从阿里云直达下载到本地仓库,并不会通过私服?希望大佬可以指正一下! 镜像仓库配置mirrorOf对哪种仓库进行镜像
手工mavenMaven工程目录结构
构建命令
Maven构建命令使用mvn开头,后面加功能参数,可以一次执行多个命令,使用空格分隔
clean把编译的去掉,target文件目录删除掉
install把你的当前项目安装到本地仓库,成为一个jar包供别的项目引用里边的类等
package会先compile,然后再clean
依赖管理依赖传递依赖具有传递性,包括直接传递和间接传递。 直接传递:在当前项目中通过依赖配置建立的依赖关系(A使用B,A和B就是直接传递) 间接传递:如果A依赖B,而B依赖C,那么A和C之间就是间接传递
冲突原则路径优先在越浅层的优先级越高
声明优先在同一层,先声明的比较高
在同一个pom中配置了相同资源的不同版本后配置的覆盖前边的
可选依赖 排除依赖①手动排除依赖,,且2可以直接把3整个依赖进来,再排除掉特定的 ②借助idea插件排除依赖 -- Maven Helper 打开pom文件,下方就可以选择切换查看方式 右键选中你需要排除的 Exclude即可 ③版本锁定--(待补充实例,拿Dubbo的吧)Dubbo的GitHub文档中应用到了这点properties spring-boot.version2.3.0.RELEASE/spring-boot.version dubbo.version2.7.8/dubbo.version/properties dependencyManagement dependencies !-- Spring Boot -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version${spring-boot.version}/version typepom/type scopeimport/scope /dependency !-- Apache Dubbo -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-dependencies-bom/artifactId version${dubbo.version}/version typepom/type scopeimport/scope /dependency /dependencies/dependencyManagementdependencies !-- Dubbo Spring Boot Starter -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId version2.7.8/version /dependency /dependencies复制代码dependencyManagement
通过它元素来管理jar包的版本,让子项目中直接引用依赖而不用列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。管理通用性我们不需要给每个子项目都去声明版本了,只需要在最顶层父类中统一进行管理。可扩展性如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。依赖范围 传递性(了解) 生命周期与插件 继承(SpringBoot就是一个很好的例子)作用通过继承可以实现在子工程中沿用父工程中的配置(与Java类似)
制作方式在子工程中声明其父工程坐标与对应的位置
!--定义该工程的父工程--parent groupId /groupId artifactId /artifactId version /version !--填写父工程的pom文件-- relativePath父工程pom文件地址/relativePath/parent复制代码如SpringBoot中parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.5.6/version relativePath/ !-- lookup parent from repository --/parent复制代码
在父工程中定义依赖管理可以管理版本,解决子工程中依赖冲突问题(上文提及到的版本锁定)
!--声明此处进行依赖管理--dependencyManagement !--具体的依赖-- dependencies dependency groupId /groupId artifactId /artifactId version /version /dependency /dependencies/dependencyManagement复制代码
继承依赖使用:在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本
dependencies dependency groupId /groupId artifactId /artifactId /dependency/dependencies复制代码
聚合 我们实际开发中,很多时候是多模块开发,会把业务单独抽离出来成为一个模块,比如Dao模块,Service模块 那这个时候比如说Dao模块发生了变化,其他所有依赖Dao模块的模块怎么办呢,都得去更新吗?他自己知道吗?还是得我们自己去重新install重新依赖,有没有办法让他们同时更新而不是单独更新呢?--这就要用到我们的聚合建立一个空模块打包类型设置为pompackagingpom/packaging复制代码聚合module 效果 私服仓库分类宿主仓库hosted:指的是我们公司或团队内部的包,并且 hosted 类型的仓库会分为 releases 和 snapshots 两个,前者是正式版,后者一般是开发测试版(快照版);保存那些无法从中央仓库直接获取的资源,比如说我们自己研发的一些项目,或者一些第三方非开源项目比如oracle(要注意版权问题)
代理仓库proxy:用来代理中央仓库,例如我们依赖的包在本地仓库没有,就会到私服获取,私服没有的话,会到中央仓库先把包下载到私服,然后再下载到本地仓库;仓库组group:把多个仓库组合起来,然后我们项目中只需要配置上这个类型的仓库地址,就可以把它里面组合的几个仓库都关联上. **快速搭载Nexus私服私服作用有时候我们是多台机器开发,而我们要去引用别人机器上的模块jar包时,这个时候对方单纯install也只是发布到对方电脑上的本地仓库而已,我们还是访问不到.这个时候就需要一个中间商私服,来存放一些需要共享的资源
nexus下载安装首先要下载 nexus 搭载我们的私服下载完成后,修改etc中的启动端口(默认是8081) 进入bin目录vim nexus进入后直接 /run_as_user 查找到run_as_root 再按 i 进入编辑模式把这一项改为false , 才可以用root用户开启nexus
修改完成后 按ESC退出编辑模式进入命令模式 输入 :wq 保存退出即可最后 ./nexus start 启动访问你设置的端口号账号默认是admin
初次登录会提示你去特定位置找密码
在该目录下寻找即可
之后可以修改默认密码
访问私服仓库(手动上传)--不推荐上方可以切换视图,左边是浏览仓库,右边的管理设置仓库,我们在管理这一层添加一个自己的仓库 这里我们创建一个宿主仓库 修改快照版/发行版 找到maven-public , 把我们刚创建的包含进去即可 去浏览页面找到我们的仓库,手动上传 idea环境上传需要配置两个地方
一个是本地仓库如何跟私服打交道 -- 对应默认的总setting文件一个是我们的工程要发布到私服具体哪个仓库 -- 对应当前项目pom文件里边的配置
上传jar认证配置上传jar包需要认证,maven的认证是在.m2/settings.xml或自己的的maven里settings.xml中servers标签下配置的.
这里特别说明一下,servers配置的ID很关键,这个与你项目里面的distrubtionManagement下配置的仓库ID一致,否则会报审核未通过的错误。
!-- 配置访问服务器的权限-- server idnexus-Melo/id usernameadmin/username passwordadmin/password /server server idMelo-Release/id usernameadmin/username passwordadmin/password /server server idMelo-Snapshots/id usernameadmin/username passwordadmin/password /server复制代码这里的id对应了setting.xml里配置的server.id信息,name任取
!-- 私服发布管理-- distributionManagement repository !-- id要跟setting中配置访问时的id一致-- idMelo-Release/id !-- 仓库地址 去nexus网站找到仓库复制url即可 -- urlhttp://ip地址:端口/repository/Melo-Release//url /repository snapshotRepository idMelo-Snapshots/id urlhttp://ip地址:端口/repository/Melo-Snapshot//url /snapshotRepository /distributionManagement复制代码上传效果 idea环境从私服获取(同时使用阿里云镜像+私服)配置全局setting.xml,我们所有项目就都会去私服找了建议使用自带的maven-public仓库组 , 然后把我们自己创建的仓库包含进去
注意不要把proxy类的仓库包含进我们的group!这样我们配置的阿里云镜像就失效了除非自己去手动改proxy代理的仓库地址,但个人感觉不太推荐,具体见后文"另外的实现方式"
配置server--访问服务器的权限包含拉取和上传的两部分配置,两部分都需要权限
!-- 配置访问服务器的权限-- !--第一个id要和下面的mirror中的id一致,代表拉取时也需要进行身份校验-- server idnexus-Melo/id username你的私服账号/username password你的私服密码/password /server!-- 下边是我们上传时的访问配置,id对应你上传时distributionManagement中写的id-- server idMelo-Release/id username你的私服账号/username password你的私服密码/password /server server idMelo-Snapshots/id username你的私服账号/username password你的私服密码/password /server复制代码配置mirror!-- 阿里云私服,拿中央仓库-- mirror idalimaven/id namealiyun maven/name urlhttp://maven.aliyun /nexus/content/groups/public//url!-- 访问中央仓库才使用阿里云镜像-- mirrorOfcentral/mirrorOf /mirror!-- 自己的maven私服-- mirror idnexus-Melo/id !--镜像名称 -- namenexus-Melo/name !--镜像除了中央仓库以外的仓库(本地有的话还是优先本地,没有再去私服找,私服没有的话会先通过阿里云下载到私服,再发送到本地)-- mirrorOf!central/mirrorOf !--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 选择你用哪个私服仓库来作为镜像,建议选择自带的maven-public,具体看上边 -- urlhttp://ip地址:端口/repository/maven-public//url /mirror复制代码扩展--mirrorOf*表示所有 !表示非
,!repo1 : 在除了repo1的仓库中寻找external: : 刚好跟上边的 !internal.repo,* 相反
**扩展--mirror默认情况下配置多个mirror的情况下,只有第一个生效。 无法连接的时候,才会去找后一个;而我们想要的效果是:当某个jar包在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载,但是maven不会这样做!
正确的操作是在profiles节点下配置多个profile,而且配置之后要激活!!!!
配置profile!-- 阿里云-- profile idaliyun/id repositories repository idaliyun/id urlhttp://maven.aliyun /nexus/content/groups/public//url releases enabledtrue/enabled /releases snapshots enabledtrue/enabled updatePolicyalways/updatePolicy /snapshots /repository /repositories /profile!-- 自己的私服-- profile!-- 注意这个id,下边激活的时候会用到,要一一对应-- idnexus-pr/id !-- 远程仓库列表 -- repositories repository !-- 上边要拉取的仓库id-- idnexus-Melo/id namenexus-Melo/name !-- 虚拟的URL形式,指向镜像的URL-- urlhttp://ip地址:端口/repository/maven-public//url layoutdefault/layout !-- 表示可以从这个仓库下载releases版本的构件-- releases enabledtrue/enabled /releases !-- 表示可以从这个仓库下载snapshot版本的构件 -- snapshots enabledtrue/enabled /snapshots /repository /repositories !-- 暂时还没有自定义插件的需求 -- !-- 插件仓库列表 --!-- pluginRepositories--!-- pluginRepository--!-- !– 上边要拉取的仓库id–--!-- idnexus-Melo/id--!-- namenexus-Melo/name--!-- urlhttp://114.132.235.87:9001/repository/maven-public//url--!-- layoutdefault/layout--!-- snapshots--!-- enabledtrue/enabled--!-- /snapshots--!-- releases--!-- enabledtrue/enabled--!-- /releases--!-- /pluginRepository--!-- /pluginRepositories-- /profile复制代码激活profile!! !--对应上边profile定义的id!!!--!-- 激活阿里云-- activeProfilealiyun/activeProfile!-- 激活nexus-- activeProfilenexus-pr/activeProfile activeProfilejdk-1.8/activeProfile复制代码实现阿里云与私服共存的效果那些中央仓库有的文件,就会走阿里云镜像去下载,如果是我们自定义的jar包(中央仓库没有的),就会走我们的私服去下载!
另外的实现方式其实我们也可以直接在私服创建一个proxy仓库,让他代理阿里云镜像就好了,但是这样其实也有个问题,就是proxy仓库本身是不允许我们自定义上传组件的,所以综合考虑的话还是上边自行配置的方法好一点写在最后maven这一块,具体的聚合,继承实例,等到真正运用上了分布式开发的时候,应该会有所渗透。而私服的运用,在多台机器上是十分重要的!
本文TAG:web幻想私服
猜你喜欢
- 2023-08-30传奇轻变攻速基址:里的这几个矿藏地图,你明白几个呢?
- 2022-02-22刺客信条3存档损坏_刺客信条起源怎么存档
- 2022-02-22psp碧之轨迹下载_碧之轨迹中文版iso
- 2022-02-21fifa15破解补丁_fifa15破解补丁怎么打
- 2022-02-21手机卡牌游戏(最火的手机卡牌游戏)
- 2022-02-21龙腾世纪起源_龙腾世纪起源自由爱mod
- 最近发表
- 标签列表
-
- 传奇手游私服 (7)
- 新开传奇手游网站 (7)
- 传奇单职业 (2)
- 传奇手游变态版 (1)
- 传奇发布网 (7)
- 传奇sf手游版 (1)
- 新开传奇 (1)
- 传奇私服 (1)
- 拳皇7k7k小游戏 (0)
- nitrome小游戏 (0)
- 最新传奇发布网 (0)
- 每日新开传奇网 (0)
- 找176复古传奇 (0)
- 超级变态热血传奇 (0)
- nba2k11最新名单 (0)
- 王者荣耀更新 (0)
- 王者荣耀体验服申请 (0)
- 英雄联盟出装顺序 (0)
- 三国志单机游戏 (0)
- 王者荣耀宫本武藏符文 (0)
- 梦幻西游109神器任务攻略 (0)
- 下载英雄联盟 (0)
- 机械公敌兰博出装 (0)
- 王者荣耀西施 (0)
- 王者荣耀无限火力 (0)
- 不知火舞王者荣耀 (0)
- 300英雄三笠出装 (0)
- 冒险岛2职业 (0)
- 龙将2官网 (0)
- 热血传奇怀旧版好玩吗 (0)
- 传奇超级 (0)
- 传奇师服 (0)
- 迷失传奇发布网 (0)
- 韩版传奇私服发布网 (0)
- 传世新开 (0)
- 传奇2外挂 (0)
- 传奇复古 (0)
- 单职业变态 (0)
- 传奇sf180 (0)
- 传世sf吧 (0)
- 传奇私服gm命令大全 (0)
- 传奇世界私服刷元宝 (0)
- dnf私服发布网 (0)
- 网页三国游戏排行榜 (0)
- 傲视千雄私服 (0)
- 热血传奇176客户端下载 (0)
- 最新机战私服 (0)
- 传奇吉吉免费版 (0)
- 蜘蛛纸牌游戏 (0)
- 最热门的网游排行榜 (0)
- 2d网游 (0)
- 网游私服排行榜 (0)
- moba网游 (0)
- 439小游戏 (0)
- 飞车小游戏 (0)
- 奥奇传说小游戏 (0)
- 龙斗士小游戏 (0)
- 下载手机游戏 (0)
- 维京神域之战 (0)
- 星际2单机 (0)
- 防守类单机游戏 (0)
- 灰烬攻略 (0)
- 战神3pc版 (0)
- 腐尸之屋 (0)
- 新神奇传说3秘籍 (0)
- 生化危机5怎么存档 (0)
- 三国群英传1单机版下载 (0)
- 捕鱼达人手机版 (0)
- 仙剑奇侠传游戏1 (0)
- 暴力摩托单机版下载 (0)
- fifa12下载 (0)
- 色单机游戏 (0)
- 三国志13修改器 (0)
- 梦幻西游单机版神剑情天3 (0)
- 对打单机游戏 (0)
- 三国群英传7补丁 (0)
- 最好单机游戏下载 (0)
- 流星蝴蝶剑秘籍大全 (0)
- 孢子 (0)
- 梦幻西游赚钱 (0)
- 梦幻西游答题 (0)
- 王者荣耀防沉迷 (0)
- 梦幻西游挖图技巧 (0)
- 梦幻岛游戏 (0)
- 轩辕剑网游官网 (0)
- 梦幻西游手游论坛 (0)
- 极道阴阳师 (0)
- 仙剑奇侠传3下载 (0)
- 七龙珠人物换装2 (0)
- 赛尔号手机版下载 (0)
- lol战队名字 (0)
- 黑湾海盗中文版 (0)
- 超级街霸4街机版 (0)
- 侵略行为 (0)
- 孤岛惊魂3结局 (0)
- 龙珠单机游戏大全 (0)
- 仙剑三游戏下载 (0)
- 策略单机游戏 (0)
- 家园2简体中文版 (0)
- 现代战争2 (0)