Maven还停留在导jar包?快来探索Nexus私服的新世界

写在前面

Maven,学习框架之前我们都会接触到的一个工具,感觉他的定位,似乎就跟git一样,只是方便我们开发?于是自然而然的,很多小猿对于Maven都只是停留在会用的阶段,利用他来构建,打包,引入jar包。
而实际上呢,Maven还有很多强大的地方,多模块开发,私服等等也是需要我们掌握的,在实际的开发中,往往是多模块共同开发,特别是我们之前提及的Dubbo分布式开发中,多模块开发是重中之重!

传统项目开发

导jar包

  • 既然是导jar包,我们是在本地windows开发,而实际项目是要放到linux服务器上,如果我们 单纯把项目打成jar包丢上去,依赖文件也是jar包,但两个系统因为环境不一样,直接丢jar包(他不会重新编译运行的),得出来的结果可能就不一样

比如String的getByte方法,在两个系统上得到的结果是不一样的,如果 没有重新编译运行,那最终也会有偏差

Maven开发

jar包(SpringBoot)

Maven还停留在导jar包?快来探索Nexus私服的新世界

应用程序的代码则是需要放到 BOOT-INF/classes目录下面;然后应用程序依赖的其他的jar包文件需要放到 BOOT-INF/lib目录下。当这个jar作为standardalone的程序运行时(没有放到container),SpringBoot会在生成的META-INF/MANIFEST.MF里面将Main-Class设置成org.springframework.boot.loader.JarLauncher,JarLauncher类会创建一个spring自己的ClassLoader: LaunchedURLClassLoader, 这个classloader 会就能通过URL来加载上面 BOOT-INF/lib里面所依赖的包,并且通过反射Manifest里面的Start-Class里面定义的类,然后invoke这个类里面的main方法。

War包(Tomcat)

所依赖的jar包放在了WEB-INF的lib目录下

Maven还停留在导jar包?快来探索Nexus私服的新世界

Maven概念

POM

Project Object Model

  • 把每个项目看成一个对象来进行管理

Maven还停留在导jar包?快来探索Nexus私服的新世界

Maven作用

项目构建和管理

提供一套自动化构建项目的方法.并且通用,兼容性好,跨平台

  • 包括打包,编译,测试,运行等一套操作下来,让你在开发环境也可以方便进行测试等功能

构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。
maven支持的构建包括有:
1. 清理, 把之前项目编译的东西删除掉,我新的编译代码做准备。
2. 编译, 把程序源代码编译为执行代码, java-class文件

  • 批量的,maven可以同时把成千上百的文件编译为class。
  • javac 不一样,javac一次编译一个文件。

  • 测试, maven可以执行测试程序代码,验证你的功能是否正确。

  • 报告, 生成测试结果的文件, 测试通过没有。
  • 打包, 把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。

  • 这个压缩文件就是项目的结果文件, 通常java程序,压缩文件是jar扩展名的。

  • 对于web应用,压缩文件扩展名是.war

  • 安装, 把5中生成的文件jar,war安装到本地仓库供别的文件使用

  • 部署, 把程序安装好可以执行。

这些在下边的生命周期其实刚刚好体现出来

依赖管理

  • 处理jar包冲突问题

统一开发结构–约定大于配置

即能进行配置的不要去编码指定,能事先约定规则的不要去进行配置。这样既减轻了劳动力,也能防止出错。

  • 实际上maven并没有强行要求约束我们项目的文件结构,而是因为他做得好,自然而然就变成一种通用的结构了

坐标

Maven还停留在导jar包?快来探索Nexus私服的新世界

仓库

Maven还停留在导jar包?快来探索Nexus私服的新世界

私服(下文中会有具体实例)

Maven还停留在导jar包?快来探索Nexus私服的新世界

下载顺序??

先在本地仓库找,找不到就去私服找,如果私服没有,则会到中央仓库下载 到私服并且发送到本地仓库

无论如何都还是最终会下到本地,区别只是从哪发送到本地而已?

  • 此处有点疑问,私服没有会去中央仓库下到私服吗?我下边配置了阿里云和私服,似乎私服没有的话是直接从阿里云 直达下载到本地仓库,并不会通过私服?希望大佬可以指正一下!

Maven还停留在导jar包?快来探索Nexus私服的新世界

图源 https://m.yisu.com/zixun/309916.html

镜像仓库配置

mirrorOf

对哪种仓库进行镜像

Maven还停留在导jar包?快来探索Nexus私服的新世界

手工maven

Maven工程目录结构

Maven还停留在导jar包?快来探索Nexus私服的新世界

构建命令

Maven构建命令使用mvn开头,后面加功能参数,可以一次执行多个命令,使用空格分隔

clean

把编译的去掉,target文件目录删除掉

install

把你的当前项目安装到本地仓库,成为一个jar包供别的项目引用 里边的类

package

会先compile,然后再clean

Maven还停留在导jar包?快来探索Nexus私服的新世界

依赖管理

依赖传递

依赖具有传递性,包括直接传递和间接传递。
直接传递:在当前项目中通过依赖配置建立的依赖关系(A使用B,A和B就是直接传递)
间接传递:如果A依赖B,而B依赖C,那么A和C之间就是间接传递

冲突原则

路径优先

在越浅层的优先级越高

声明优先

在同一层,先声明的比较高

在同一个pom中配置了相同资源的不同版本

后配置的覆盖前边的

Maven还停留在导jar包?快来探索Nexus私服的新世界

可选依赖

Maven还停留在导jar包?快来探索Nexus私服的新世界

排除依赖

①手动排除依赖,,且2可以直接把3整个依赖进来,再排除掉特定的

Maven还停留在导jar包?快来探索Nexus私服的新世界
Maven还停留在导jar包?快来探索Nexus私服的新世界

②借助idea插件排除依赖 — Maven Helper

Maven还停留在导jar包?快来探索Nexus私服的新世界

打开pom文件,下方就可以选择切换查看方式

Maven还停留在导jar包?快来探索Nexus私服的新世界

右键选中你需要排除的 Exclude即可

Maven还停留在导jar包?快来探索Nexus私服的新世界

③版本锁定–(待补充实例,拿Dubbo的吧)

Dubbo的GitHub文档中应用到了这点


    2.3.0.RELEASE
    2.7.8

            org.springframework.boot
            spring-boot-dependencies
            ${spring-boot.version}
            pom
            import

            org.apache.dubbo
            dubbo-dependencies-bom
            ${dubbo.version}
            pom
            import

        org.apache.dubbo
        dubbo-spring-boot-starter
        2.7.8

dependencyManagement

  • 通过它元素来管理jar包的版本,让子项目中直接引用依赖而不用列出版本号。Maven会 沿着父子层次向上走,直到找到一个拥有元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

管理通用性

  • 我们不需要给每个子项目都去声明版本了,只需要在 最顶层父类中统一进行管理。

可扩展性

  • 如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

依赖范围

Maven还停留在导jar包?快来探索Nexus私服的新世界

传递性(了解)

Maven还停留在导jar包?快来探索Nexus私服的新世界

生命周期与插件

Maven还停留在导jar包?快来探索Nexus私服的新世界
Maven还停留在导jar包?快来探索Nexus私服的新世界

继承(SpringBoot就是一个很好的例子)

作用

通过继承可以实现在子工程中沿用父工程中的配置(与Java类似)

制作方式

在子工程中声明其父工程坐标与对应的位置


  父工程pom文件地址

如SpringBoot中


        org.springframework.boot
        spring-boot-starter-parent
        2.5.6

在父工程中定义依赖管理

可以管理版本,解决子工程中依赖冲突问题(上文提及到的版本锁定)


继承依赖使用:在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本


聚合

Maven还停留在导jar包?快来探索Nexus私服的新世界
  • 我们实际开发中,很多时候是多模块开发,会把业务单独抽离出来成为一个模块,比如 Dao模块, Service模块
  • 那这个时候比如说 Dao模块发生了变化,其他所有依赖 Dao模块的模块怎么办呢,都得去更新吗?他自己知道吗?还是得我们自己去重新install重新依赖,有没有办法让他们 同时更新而不是单独更新呢?–这就要用到我们的聚合

建立一个空模块

打包类型设置为pom

pom

聚合module

Maven还停留在导jar包?快来探索Nexus私服的新世界

效果

Maven还停留在导jar包?快来探索Nexus私服的新世界

私服仓库分类

  • 宿主仓库hosted:指的是我们公司或团队内部的包,并且 hosted 类型的仓库会分为 releases 和 snapshots 两个,前者是正式版,后者一般是开发测试版(快照版);

保存那些无法从中央仓库直接获取的资源,比如说我们自己研发的一些项目,或者一些第三方非开源项目比如oracle(要注意版权问题)

  • 代理仓库proxy:用来代理中央仓库,例如我们依赖的包在本地仓库没有,就会到私服获取,私服没有的话,会到中央仓库先把包下载到私服,然后再下载到本地仓库;
  • 仓库组group:把多个仓库组合起来,然后我们项目中只需要配置上这个类型的仓库地址,就可以把它里面组合的几个仓库都关联上.

Maven还停留在导jar包?快来探索Nexus私服的新世界

**快速搭载Nexus私服

私服作用

有时候我们是多台机器开发,而我们要去引用别人机器上的模块jar包时,这个时候对方单纯install也只是发布到对方电脑上的本地仓库而已,我们还是访问不到.这个时候就需要一个中间商私服,来存放一些需要 共享的资源

nexus下载安装

  • 首先要下载 nexus 搭载我们的私服
  • 下载完成后,修改etc中的启动端口(默认是8081)

Maven还停留在导jar包?快来探索Nexus私服的新世界
  • 进入bin目录
  • vim nexus
  • 进入后直接 /run_as_user 查找到run_as_root 再按 i 进入编辑模式

Maven还停留在导jar包?快来探索Nexus私服的新世界
把这一项改为false , 才可以 用root用户开启nexus
  • 修改完成后 按ESC退出编辑模式进入命令模式 输入 :wq 保存退出即可
  • 最后 ./nexus start 启动
  • 访问你设置的端口号

账号默认是admin

初次登录会提示你去特定位置找密码

Maven还停留在导jar包?快来探索Nexus私服的新世界
在该目录下寻找即可

之后可以修改默认密码

访问私服仓库(手动上传)–不推荐

  • 上方可以切换视图,左边是浏览仓库,右边的管理设置仓库,我们在管理这一层添加一个自己的仓库

Maven还停留在导jar包?快来探索Nexus私服的新世界

这里我们创建一个宿主仓库

Maven还停留在导jar包?快来探索Nexus私服的新世界

修改快照版/发行版

Maven还停留在导jar包?快来探索Nexus私服的新世界

找到maven-public , 把我们刚创建的包含进去即可

Maven还停留在导jar包?快来探索Nexus私服的新世界

去浏览页面找到我们的仓库,手动上传

Maven还停留在导jar包?快来探索Nexus私服的新世界

idea环境上传

需要配置两个地方

  • 一个是本地仓库如何跟私服打交道 — 对应默认的 总setting文件
  • 一个是我们的工程要发布到私服具体哪个仓库 — 对应 当前项目pom文件里边的配置

Maven还停留在导jar包?快来探索Nexus私服的新世界

上传jar认证配置

上传jar包需要 认证,maven的认证是在.m2/settings.xml或自己的的maven里 settings.xml中servers标签下配置的.

这里特别说明一下,servers配置的ID很关键,这个与你项目里面的 distrubtionManagement下配置的仓库ID一致,否则会报审核未通过的错误。


        nexus-Melo
        admin
        admin

          Melo-Release
          admin
          admin

          Melo-Snapshots
          admin
          admin

这里的id对应了setting.xml里配置的server.id信息name任取


            Melo-Release

            http://ip地址:端口/repository/Melo-Release/

            Melo-Snapshots
            http://ip地址:端口/repository/Melo-Snapshot/

上传效果

Maven还停留在导jar包?快来探索Nexus私服的新世界

idea环境从私服获取(同时使用阿里云镜像+私服)

  • 配置全局setting.xml,我们所有项目就都会去私服找了

建议使用自带的maven-public仓库组 , 然后把我们 自己创建的仓库包含进去

Maven还停留在导jar包?快来探索Nexus私服的新世界

注意不要把proxy类的仓库包含进我们的group!这样我们配置的阿里云镜像就失效了

除非自己去手动改proxy代理的仓库地址,但个人感觉不太推荐,具体见后文”另外的实现方式”

配置server–访问服务器的权限

包含拉取和上传的两部分配置,两部分都需要权限


        nexus-Melo
        你的私服账号
        你的私服密码

          Melo-Release
          你的私服账号
          你的私服密码

          Melo-Snapshots
          你的私服账号
          你的私服密码

配置mirror


      alimaven
      aliyun maven
      http://maven.aliyun.com/nexus/content/groups/public/

      central

      nexus-Melo

      nexus-Melo

      !central

      http://ip地址:端口/repository/maven-public/

扩展– mirrorOf

*表示所有 !表示非

,!repo1 : 在除了repo1的仓库中寻找
external:
: 刚好跟上边的 !internal.repo,* 相反

扩展– mirror**

  • 默认情况下配置多个 mirror的情况下,只有第一个生效。
  • 无法连接的时候,才会去找后一个;而我们想要的效果是:当某个jar包在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载,但是maven不会这样做!

正确的操作是在profiles节点下配置多个profile,而且配置之后 要激活!!!!

配置profile


          aliyun

                  aliyun
                  http://maven.aliyun.com/nexus/content/groups/public/

                      true

                      true
                      always

      nexus-pr

          nexus-Melo
          nexus-Melo

          http://ip地址:端口/repository/maven-public/
          default

            true

            true

激活profile!!


      aliyun

      nexus-pr
      jdk-1.8

实现阿里云与私服共存的效果

那些中央仓库有的文件,就会 走阿里云镜像去下载,如果是我们自定义的jar包(中央仓库没有的),就会 走我们的私服去下载!

另外的实现方式

  • 其实我们也可以直接在私服创建一个proxy仓库,让他代理阿里云镜像就好了,但是这样其实也有个问题,就是proxy仓库本身是不允许我们自定义上传组件的,所以综合考虑的话还是上边自行配置的方法好一点

写在最后

  • maven这一块,具体的 聚合继承实例,等到真正运用上了分布式开发的时候,应该会有所渗透。而私服的运用,在多台机器上是十分重要的!

Original: https://www.cnblogs.com/melojun/p/15478774.html
Author: Melo~
Title: Maven还停留在导jar包?快来探索Nexus私服的新世界

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572214/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关于Mysql触发器

    关于:after触发器—是在记录操纵之后触发,是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作before触发器—是在记录操纵之前触发,是先完…

    Java 2023年6月13日
    081
  • Java核心技术-Lambda

    lambda表达式就是一个代码块以及必须传入代码的变量规范。lambda表达式就是把一个代码块作为参数,放在参数列表里面进行传递,共这个方法使用。数学上带参数变量的表达式就成为la…

    Java 2023年6月5日
    072
  • 记一个 Base64 有关的 Bug

    本文原计划写两部分内容,第一是记录最近遇到的与 Base64 有关的 Bug,第二是 Base64 编码的原理详解。结果写了一半发现,诶?不复杂的一个事儿怎么也要讲这么长?不利于阅…

    Java 2023年6月5日
    056
  • 【转】高并发下秒杀商品,你必须知道的9个细节

    0.前言 高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。 秒杀一般出现在商城的促销活动中,指定…

    Java 2023年6月7日
    095
  • jemeter使用

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @ 前言 一、jemeter是什么? 二、使用 1.简单测试并发接口 1.1先添加一个线程组如下: 1.2 添加一…

    Java 2023年6月13日
    077
  • 团队vue基础镜像选择思考

    前端镜像可以考虑使用nginx或者openresty; 镜像 大小 说明nginx:1.20.2-alpine 8.41 MB 最小最新版本nginx:1.21.4 50.95 M…

    Java 2023年6月8日
    087
  • jQuery

    什么是封装? 打包?安装?组合? 我们将一些功能组装在一起,生成一些简单好用的API。复杂的API就不用在看了。 比如:我们通过元素的ID获取页面的一个元素DOM对象 原生的API…

    Java 2023年6月7日
    081
  • 初读鸟哥的linux私房菜的收获

    搞了十几年开发,一直是在windows下面搞.net开发,有一些不甘心,所以转行去搞java开发,当然也少不了要学习一下linux嘛。前同事波神是这方面的高手,给我推荐去读《鸟哥的…

    Java 2023年6月7日
    078
  • C# 线程手册 第七章 网络和线程 创建一个客户端

    现在你已经对.NET 中的网络编程有了一个初步的了解,现在我们来实际讨论下本章将要实现的示例程序。这个例子的目的是通过创建一个网络应用程序来让你熟悉线程的使用。这个程序实际上由两个…

    Java 2023年5月29日
    063
  • Servlet中使用注解@WebServlet进行url匹配报404的问题

    首先这个问题是比较简单,前提是你使用了@WebServlet注解,然后检查了所有配置都没有问题 最终还是前端浏览器报404错误,那多半都是你看一下web.xml配置文件里 meta…

    Java 2023年6月6日
    0101
  • SpringBoot嵌入pentaho-kettle工具实现数据trans转换和job任务手动执行

    1、拉取代码后,maven依赖环境下载 2、下载pentaho-kettle的zip包:https://sourceforge.net/projects/pentaho/files…

    Java 2023年5月30日
    0131
  • RabbitMQ的应用场景以及基本原理介绍

    RabbitMQ 是一个由 erlang 开发的 AMQP(Advanced Message Queuing Protocol)的开源实现。 AMQP:高级消息队列协议,是应用层协…

    Java 2023年5月30日
    065
  • 企业DevOps之路:私有镜像仓库 Harbor 搭建

    Harbor 概述 容器技术越来越火,越来越成熟,容器应用的开发和运行始终离不开可靠的镜像管理,虽然 Docker 官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑;部署私有…

    Java 2023年6月7日
    068
  • Phoenix简介及安装部署使用

    Phoenix简介及安装部署使用 posted @2017-10-14 11:33 花弄影 阅读(374 ) 评论() 编辑 Original: https://www.cnblo…

    Java 2023年6月16日
    069
  • 5-多线程

    一、创建多线程的四种方式 1.方式一:继承Thread类的方式 创建一个继承于Thread类的子类 重写Thread类的run() –> 将此线程执行的操作声明在…

    Java 2023年6月7日
    0100
  • 什么是DevOps?为大家都在用DevOps

    摘要:什么是DevOps?为大家都在用DevOps,随着市场竞争的加剧,对企业的软件交付速度提出了更高的要求。像大家熟悉的大厂也不例外,落地DevOps、实现高效交付成为了企业共同…

    Java 2023年6月8日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球