Maven(二)高级操作

news2024/11/18 7:37:04

目录

    • 一、分模块开发与涉及(重点)
      • 1.工程模块划分
      • 2.modules_common拆分
      • 3.modules_pojo拆分
      • 4.modules_dao拆分
      • 5.modules_service拆分
      • 6.modules_controller拆分
      • 7.总结
    • 二、聚合(重点)
      • 1.多模块构建维护
      • 2.聚合
    • 三、继承(重点)
      • 1.模块依赖关系维护
      • 2.继承
      • 3.继承依赖定义
      • 4.继承依赖使用
      • 5.继承的资源
      • 6.继承与聚合的区别
    • 四、属性(重点)
      • 1.版本统一的重要性
      • 2.属性类别:自定义属性
      • 3.属性类别:内部属性
      • 4.属性类别:Setting属性
      • 5.属性类别:环境变量属性
    • 五、版本管理
      • 1.工程版本区分
      • 2.工程版本
      • 3.工程版本约定
    • 六、资源配置
      • 1.资源配置多文件维护
      • 2.配置文件引用pom属性
    • 七、多环境开发配置
      • 1.多环境兼容
      • 2.多环境配置
      • 3.加载指定环境
    • 八、跳过测试(了解)
      • 1.跳过测试环境的应用场景
      • 2.使用命令跳过测试
      • 2.使用界面操作跳过测试
      • 3.使用配置跳过测试
    • 九、私服(重点)
      • 1.分模块合作开发
      • 2.Nexus
        • 1)Nexus下载
        • 2)Nexus启动
        • 3)Nexus修改端口
        • 4)Nexus修改服务器配置
      • 3.私服资源获取
      • 4.仓库分类
      • 5.创建宿主仓库
      • 6.上传资源
      • 7.对用户/角色的操作
      • 8.idea环境中资源上传与下载
      • 9.访问私服配置
        • 1)本地仓库访问私服
        • 2)项目工程访问私服
        • 3)通过命令访问私服
        • 补充:如何通过命令将 jar 包推到本地仓库

在这里插入图片描述

一、分模块开发与涉及(重点)

拆分前项目地址:https://gitee.com/acgkaka/SpringBootExamples/tree/master/springboot-mybatis-plus

拆分后项目地址:https://gitee.com/acgkaka/SpringBootExamples/tree/master/springboot-mybatis-plus-modules

1.工程模块划分

这里我们将一个典型的 spring mvc 项目的各个模块进行拆分,各模块之间通过接口进行通信。

(为了美观,我在图片上进行了顺序调整)

在这里插入图片描述

创建子模块的时候,可以在IDEA中直接右键项目文件夹,然后选择新建module:

在这里插入图片描述

2.modules_common拆分

  • 新建模块

  • 拷贝原始项目中对应的相关内容到modules_common模块中

    • 响应结果类(Result)
    • 依赖
      • lombok
  • 将 <parent> 标签内容注释,并添加 <groupId> 和 <version> 标签

    <groupId>com.demo</groupId>
    <artifactId>modules_common</artifactId>
    <version>1.0-SNAPSHOT</version>
    
  • 执行 clean install,确保模块可以独立安装,不会报编译错误

3.modules_pojo拆分

  • 新建模块

  • 拷贝原始项目中对应的相关内容到modules_pojo模块中

    • 实体类(User)
    • 依赖
      • mybatis-plus-boot-starter
      • modules_common(对modules_common模块执行install命令,将其安装到仓库后使用)
  • 将 <parent> 标签内容注释,并添加 <groupId> 和 <version> 标签

    <groupId>com.demo</groupId>
    <artifactId>modules_pojo</artifactId>
    <version>1.0-SNAPSHOT</version>
    
  • 执行 clean install,确保模块可以独立安装,不会报编译错误

因为我的 User.java 中使用到了一些 MybatisPlus 的注解,所以需要在 modules_pojo 中就添加 MyBatisPlus 的依赖,下面是我的 User.java:

package com.demo.module.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

/**
 * <p>
 * 用户表
 * </p>
 *
 * @author ACGkaka
 * @since 2021-04-25
 */
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class TUser implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
    /**
     * 更新时间
     */
    private LocalDateTime updateTime;
}

4.modules_dao拆分

  • 新建模块

  • 拷贝原始项目中对应的相关内容到modules_dao模块中

    • 数据层接口(UseMapper)
    • 配置文件:
      • 保留与数据层相关配置文件(2个:UserMapper.xml、application.yml)
    • 测试文件:
      • 保留测试程序中代码生成器测试类(CodeGenerateUtils.java)
    • 依赖
      • mysql-connector
      • druid-spring-boot-starter
      • mybatis-plus-generator
      • freemarker
      • 直接依赖modules_pojo(对modules_pojo模块执行install命令,将其安装到仓库后使用)
      • 间接依赖modules_common(由modules_pojo模块负责依赖关系的建立)
    • 将 <parent> 标签内容注释,并添加 <groupId> 和 <version> 标签
    <groupId>com.demo</groupId>
    <artifactId>modules_dao</artifactId>
    <version>1.0-SNAPSHOT</version>
    
  • 执行 clean install,确保模块可以独立安装,不会报编译错误

5.modules_service拆分

  • 新建模块

  • 拷贝原始项目中对应的相关内容到modules_service模块中

    • 业务层接口与实现类(UserService、UserServiceImpl)
    • 依赖
      • 直接依赖modules_dao(对modules_dao模块执行install命令,将其安装到仓库后使用)
      • 间接依赖modules_pojo(由modules_dao模块负责依赖关系的建立)
      • 间接依赖modules_common(由modules_pojo模块负责依赖关系的建立)
  • 将 <parent> 标签内容注释,并添加 <groupId> 和 <version> 标签

    <groupId>com.demo</groupId>
    <artifactId>modules_service</artifactId>
    <version>1.0-SNAPSHOT</version>
    
  • 执行 clean install,确保模块可以独立安装,不会报编译错误

6.modules_controller拆分

  • 新建模块

  • 拷贝原始项目中对应的相关内容到modules_controller模块中

    • 业务层接口与实现类(UserService、UserServiceImpl)
    • 依赖
      • 直接依赖modules_service(对modules_service模块执行install命令,将其安装到仓库后使用)
      • 间接依赖modules_dao(由modules_service模块负责依赖关系的建立)
      • 间接依赖modules_pojo(由modules_dao模块负责依赖关系的建立)
      • 间接依赖modules_common(由modules_pojo模块负责依赖关系的建立)
  • 将 <parent> 标签内容注释,并添加 <groupId> 和 <version> 标签

    <groupId>com.demo</groupId>
    <artifactId>modules_controller</artifactId>
    <version>1.0-SNAPSHOT</version>
    
  • 由于modules_controller还使用了 spring-boot-starter-web,因此需要继承 spring-boot-starter-parent

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/>
    </parent>
    
  • 启动modules_controller模块。

启动modules_controller模块后,我们可以看到日志中显示已经启动成功了:

在这里插入图片描述

浏览器调用服务接口,响应正常:

在这里插入图片描述

7.总结

  • 分模块开发
    • 模块中仅包含当前模块对应的功能类与配置文件;
    • spring核心配置根据模块功能不同进行独立制作;
    • 当前模块所依赖的模块通过导入坐标的形式加入当前模块后才可以使用;
    • web.xml 需要加载所有spring核心配置文件(我们这里是SpringBoot项目,可以忽略)

二、聚合(重点)

1.多模块构建维护

我们进行多模块拆分之后,如果我们中间有一个模块,例如 dao 模块,那么依赖 dao 模块的模块并不能知道 dao 模块是否有更新,因此我们需要一个单独的模块来统一管理所有的模块。

2.聚合

  • 作用:聚合用于快速构建 maven 工程,一次性构建多个项目/模块。

  • 制作方法:

    • 创建一个空模块,打包类型定义为pom。

      <packaging>pom</packaging>
      
    • 定义当前模块进行构建操作时关联的其他模块名称。

      (如果在之前创建模块的时候,使用的是IDEA中右键->新建->模块的方式,会自动添加好相应的 module 配置)

      <modules>
          <module>modules_common</module>
          <module>modules_pojo</module>
          <module>modules_dao</module>
          <module>modules_service</module>
          <module>modules_controller</module>
      </modules>
      
  • 注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关。

三、继承(重点)

1.模块依赖关系维护

我们在进行多模块拆分之后,如果不同模块之间使用的是相同依赖的不同版本,切不同版本之间不能相互兼容的话,就会导致依赖冲突。

这时候,我们可以使用一个模块来统一管理依赖的版本号,其他的模块只需指定依赖的部分坐标即可,不需要指定依赖的版本号了。

2.继承

  • 作用:通过继承可以实现在子工程中沿用父工程中的配置

    • Maven 中的继承与 Java 中的继承相似,在子工程中配置继承关系。
  • 制作方式:

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

      <!-- 定义该工程的父工程 -->
      <parent>
      	<groupId>com.demo</groupId>
          <artifactId>springboot-mybatis-plus-modules</artifactId>
          <version>1.0-SNAPSHOT</version>
          <!-- 填写父工程的pom文件,默认为../pom.xml -->
          <relativePath>../pom.xml</relativePath>
      </parent>
      

既然子工程会沿用父工程中的依赖,这里我们就会想到之前拆分好的 modules_controller 模块中指定了父工程为 spring-boot-starter-parent包。

按住 Ctrl 点击 artifactId 可以进入到相应模块的 pom.xml 配置文件中。

我们可以看到 spring-boot-starter-parent 的 pom.xml 内容如下,其中并没有引用其他的依赖,而是又继承了 spring-boot-dependencies 工程。

在这里插入图片描述

我们进入 spring-boot-dependencies 的 pom.xml 中,内容如下,发现其中也并没有引用其他的依赖,而是有一个<dependencyManagement> 标签:

在这里插入图片描述

可见父工程 spring-boot-starter-parent 主要是通过 spring-boot-dependencies 进行了一个依赖版本管理的功能,下面我们就可以删掉 spring-boot-starter-parent 父工程,自己指定 spring-boot-dependencies 进行配置管理即可。

3.继承依赖定义

  • 在父工程中定义依赖管理(注意:这里只是声明版本,并不真实引入

    <!-- 声明此处进行依赖管理 -->
    <dependencyManagement>
    	<!-- 具体的依赖 -->
        <dependencies>
            <!-- spring boot 环境 -->
        	<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.4.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

4.继承依赖使用

  • 在子工程中定义依赖关系,无需声明依赖版本,版本参照父工程中依赖的版本。

    <dependencies>
        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Boot Test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
    </dependencies>
    

5.继承的资源

子工程可以从父工程中继承的资源如下:

在这里插入图片描述

看到这里,我们就可以把子模块的 groupId 和 version 去除掉了。

(一般情况下,子模块和父模块的组织ID和版本号保持一致,特殊情况也可以不一致)

6.继承与聚合的区别

  • 作用
    • 聚合用于快速构建项目
    • 继承用于快速配置
  • 相同点
    • 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系只做到同一个pom文件中。
    • 聚合与继承均属于设计型模块,并无实际的模块内容。
  • 不同点
    • 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些。
    • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己。

四、属性(重点)

1.版本统一的重要性

我们在项目依赖过程中,经常会需要用到多个版本相同的依赖,例如:

在这里插入图片描述

如何更好地统一对这些版本进行管理呢?

2.属性类别:自定义属性

  • 作用

    • 等同于定义变量,方便统一维护。
  • 定义格式:

    <!-- 自定义属性 -->
    <properties>
    	<spring.version>5.1.9.RELEASE</spring.version>
        <junit.version>4.12</junit.version>
    </properties>
    
  • 调用格式:

    <dependency>
    	<groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    

3.属性类别:内部属性

  • 作用

    • 使用maven内置属性,快速配置
  • 调用格式:

    ${basedir}
    ${version}
    <!-- 同${version},project.可以省略 -->
    ${project.version}
    

4.属性类别:Setting属性

  • 作用

    • 使用 Maven 配置文件 settings.xml 中地标签属性,用于动态配置
  • 调用格式:

    ${settings.localRepository}
    
  • 系统属性查询方式

    mvn help:system
    

查询系统属性,可以看到有两个分区:System Properties 和 Environment Variables。

  • System Properties:就是我们说的系统属性。我们使用${等号前面的内容},就可以获取到等号后面的内容了。
  • Environment Variables:就是我们下面要说的环境变量。

在这里插入图片描述

5.属性类别:环境变量属性

  • 作用

    • 使用 Maven 配置文件 settings.xml 中的标签属性,用于动态配置
  • 调用格式:

    ${env.JAVA_HOME}
    
  • 环境变量属性查询方式

    mvn help:system
    

在这里插入图片描述

五、版本管理

1.工程版本区分

2.工程版本

  • SNAPSHOT(快照版本)
    • 项目开发过程中,为方便团队成员合作,解决模块间相互依赖和实时更新的问题,开发者对每个模块进行构建的时候,输出的临时性版本叫快照版本(测试阶段版本)
    • 快照版本会随开发的进展不断更新。
  • RELEASE(发布版本)
    • 项目开发进入阶段里程碑后,想团队外部发布较为稳定的版本,这种版本所对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当亲发布版本内容,这种版本称为发布版本。

3.工程版本约定

  • 约定规范:
    • <主版本>.<次版本>.<增量版本>.<里程碑版本>
    • 主版本:表示项目重大架构的变更,如:spring5 相较于 spring4 的迭代
    • 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞
    • 增量版本:表示有重大漏洞的修复
    • 里程碑版本:表示一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相比,相对来说不是很稳定,有待更多的测试。
  • 范例:
    • 5.1.9.RELEASE

六、资源配置

1.资源配置多文件维护

我们在进行项目管理的时候,除了需要对依赖的版本进行管理之外,还需要对配置文件进行管理。例如:jdbc.properties

在这里插入图片描述

2.配置文件引用pom属性

  • 作用

    • 在任意配置文件中加载pom文件中定义的属性。
  • 调用格式:

    ${jdbc.url}
    
  • 开启配置文件加载pom属性

    <!-- 配置资源文件对应的信息 -->
    <resources>
    	<resource>
        	<!-- 设定配置文件对应的位置目录,支持使用属性动态设定路径 -->
            <directory>${project.basedir}/src/main/resources</directory>
            <!-- 开启对配置文件的资源加载过滤 -->
            <filtering>true</filtering>
        </resource>
    </resources>
    

七、多环境开发配置

1.多环境兼容

我们在开发过程中,经常会需要在不同环境进行部署,比如开发环境、测试环境、生产环境等,那么在不同环境下就需要进行不同的配置。能不能通过 Maven 来实现多个环境下不同配置的切换呢?

2.多环境配置

在多环境下,我们可以通过 <profiles> 标签来指定不同环境的不同配置,以及默认使用哪个配置。

<!-- 创建多环境 -->
<profiles>
	<!-- 定义具体的环境:生产环境 -->
    <profile>
    	<!-- 定义环境对应的唯一名称 -->
        <id>pro_env</id>
        <!-- 定义环境中专用的属性值 -->
        <properties>
        	<property>
            	<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
            </property>
        </properties>
        <!-- 设置为默认配置 -->
        <activation>
        	<activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <!-- 定义具体的环境:开发环境 -->
    <profile>
    	<id>dev_env</id>
        ......
    </profile>
</profiles>

3.加载指定环境

  • 作用

    • 加载指定环境配置
  • 调用格式

    mvn 指令 -P 环境定义id
    
  • 范例

    mvn install -P pro_env
    

八、跳过测试(了解)

1.跳过测试环境的应用场景

  • 整理模块功能未开发
  • 模块中某个功能未开发完毕
  • 单个功能更新调试导致其他功能失效
  • 快速打包

2.使用命令跳过测试

  • 命令

    # 方式一(推荐)
    mvn 指令 -DskipTests
    # 方式二
    mvn 指令 -Dmaven.test.skip=true
    
    • 方式一:执行 testResources、testCompile,只跳过 test。即编译并处理测试代码和测试资源文件,但是不执行测试。
    • 方式二:跳过 testResources、testCompile、test 这三个生命周期阶段。即:不处理测试资源文件、不便宜测试代码,也不执行测试。

2.使用界面操作跳过测试

3.使用配置跳过测试

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <configuration>
        <!-- 设置跳过测试 -->
    	<skipTest>true</skipTest>
        <!-- 包含指定的测试用例 -->
        <includes>
        	<include>**/User*Test.java</include>
        </includes>
        <!-- 排除指定的测试用例 -->
        <excludes>
        	<exclude>*/User*TestCase.java</exclude>
        </excludes>
    </configuration>
</plugin>

九、私服(重点)

1.分模块合作开发

在这里插入图片描述

2.Nexus

  • Nexus 时 Sonatype公司的一款 maven 私服产品。
  • 下载地址:https://help.sonatype.com/repomanager3/product-information/download

1)Nexus下载

打开下载地址,页面如下,我们选择 Windows 版本。

在这里插入图片描述

下载后文件如下:

在这里插入图片描述

解压后,文件内容如下:

在这里插入图片描述

2)Nexus启动

使用 cmd 控制台命令行,进入 nexus-3.52.0-01\bin 目录,执行如下命令启动:

# .exe可以省略
nexus.exe /run nexus

启动过程有点长,启动成功后控制台内容如下所示:

在这里插入图片描述

访问地址为:http://localhost:8081

访问nexus地址,加载页面如下:

在这里插入图片描述

加载成功后,页面如下,我们点击右上角的登录:

在这里插入图片描述

第一次登录会提示你 admin 用户密码的存放位置:

打开文件所在目录:

在这里插入图片描述

打开 admin.password 文件:

在这里插入图片描述

输入密码,点击登录即可:

第一次登陆后需要进行相应的设置,点击 Next

在这里插入图片描述

修改密码后,点击 Next

配置是否允许匿名访问,选择 Disable,点击 Next

完成初始配置,点击 Finish。

3)Nexus修改端口

如果想修改端口,可以在 nexus-3.52.0-01\etc 目录下的 nexus-default.properties 文件中进行修改:

在这里插入图片描述

在这里修改端口,重启后即可生效:

在这里插入图片描述

4)Nexus修改服务器配置

打开 nexus-3.52.0-01\bin 目录中的 nexus.vmoptions 文件,可以对服务器的运行参数进行配置:(例如:-Xms指定最小运行内存,-Xmx指定最大运行内存)

在这里插入图片描述

3.私服资源获取

在项目中,一部分我们自己创建的包会放到私服仓库上,一部分像Spring这类公共的包会放到中央仓库上。

在这里插入图片描述

这样就需要配置两个服务器地址,能不能合并一下呢?

当然可以,我们把私服扩展一下,在私服中单独存在一个仓库用来存放从中央仓库中获取资源,这样我们连接一个服务器地址即可。

在这里插入图片描述

为了区分我们自己资源的正式版本和临时版本,还需要存在一个单独用来存放临时版本的仓库。

在这里插入图片描述

为了更方便的获取依赖的位置,我们可以创建一个仓库组,方便对统一仓库组的其他仓库进行中的资源配置。

在这里插入图片描述

4.仓库分类

  • 宿主仓库 hosted
    • 用途:保存无法从中央仓库获取的资源,包括:
      • 自主研发
      • 第三方非开源项目
  • 代理仓库 proxy
    • 用途:代理远程仓库,通过 nexus 访问其他公共仓库,例如中央仓库
  • 仓库组 group
    • 将若干个仓库组成一个群组,简化配置
    • 仓库组不能保存资源,属于设计型仓库

我们登录 Nexus 以后,可以看到页面上方有两个标签,左边是我们浏览资源用的,右边是设置 Nexus 服务器用的,默认是在左边。

在这里插入图片描述

在资源浏览页面的左边有四个标签,分别是:首页、搜索页面、浏览仓库、上传。我们对于仓库的浏览主要是在 Browse 页面中:

在这里插入图片描述

在 Browse 页面中,我们可以看到这里主要有三种图标,这三种图标就对应我们三种仓库:

  • 代理仓库:带有一个链接的图标。

    在这里插入图片描述

  • 宿主仓库:一个干净的图标。

    在这里插入图片描述

  • 仓库组:带有一个文件夹的图标。

    在这里插入图片描述

5.创建宿主仓库

点击页面上方切换到服务器设置界面, 点击 Repositories -> Create repository

在这里插入图片描述

下拉,从 3 个 maven2 中选择 maven2 (hosted)

在这里插入图片描述

命名仓库,并选择对应的仓库类型,比如我创建一个用来存放发布版本的仓库叫:my-release

在这里插入图片描述

往下拉,选择 Create repository,创建仓库。

在这里插入图片描述

我们可以看到仓库已经创建成功了。

在这里插入图片描述

为了后续方便操作,我们把刚刚创建好的仓库,添加到 maven-public 仓库组中,回头我们直接访问 maven-public 就都可以访问了,不用挨个去找了。

点击 maven-public,往下拉可以看到右边是已经添加到群组中的仓库,我们把左边刚刚创建好的仓库移到右边,保存即可。

在这里插入图片描述

6.上传资源

仓库创建好了,接下来我们就要往仓库中传一些资源。

点击页面上方的方框,回到仓库浏览界面 Browse,点击我们刚才创建好的仓库。

在这里插入图片描述

点击 Upload component 进入上传界面。

在这里插入图片描述

将文件上传好,坐标信息填好后,就可以上传了。

注意:这里我创建的是 RELEASE 仓库,不要上传 SNAPSHOT 版本的 jar 包。

在这里插入图片描述

上传成功,点击 view it now

在这里插入图片描述

就可以看到我们上传的内容在仓库中的信息了。

在这里插入图片描述

在这里插入图片描述

或者在 Browse 页面中,点击我们的仓库查看:

在这里插入图片描述

如果想在仓库中删除依赖,直接选择某个依赖或者某个包进行删除即可:

(删除之后不会立刻消失,需要刷新页面)

在这里插入图片描述

7.对用户/角色的操作

Nexus 还在服务器设置页面,提供了用户/角色的操作,有兴趣的可以自己扩展了解下:

在这里插入图片描述

8.idea环境中资源上传与下载

在页面上进行手工上传,主要是针对第三方的依赖进行操作,我们大部分情况下还是在 idea 中进行资源的上传与下载。

在这里插入图片描述

对于连接私服的地址、用户名和密码,我们在 maven 的 settings.xml 文件中进行配置:

在这里插入图片描述

9.访问私服配置

1)本地仓库访问私服

  • 配置本地仓库访问私服的权限(settings.xml)

    <servers>
    	<server>
        	<id>my-release</id>
            <username>admin</username>
            <password>admin</password>
        </server>
        <server>
        	<id>my-snapshots</id>
            <username>admin</username>
            <password>admin</password>
        </server>
    </servers>
    
  • 配置本地仓库资源来源(settings.xml)

    <mirrors>
        <!-- 之前配置的阿里云仓库 -->
        <mirror>
            <id>nexus-aliyun</id>
            <!-- 当需要访问中央仓库时,去阿里云仓库拿 -->
            <mirrorOf>central</mirrorOf>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
        <!-- 我们自己的私服仓库 -->
    	<mirror>
        	<id>nexus-mine</id>
            <!-- 所有的资源都从私服仓库拿 -->
            <mirrorOf>*</mirrorOf>
            <url>http://localhost:8081/repository/maven-public</url>
        </mirror>
    </mirrors>
    

当仓库组在查找资源时会从上往下逐一查找,所以我们直接配置 maven-public 即可。

在这里插入图片描述

怎么获取配置里面的 url 路径呢,我们可以去 Browse 页面,有一列叫 URL,我们点击这里的 copy

在这里插入图片描述

点击 Ctrl+C,就可以把路径拷贝下来了。

在这里插入图片描述

2)项目工程访问私服

  • 配置当前项目访问私服上传资源的保存位置(pom.xml)

    <distributionManagement>
        <!-- 正式仓库 -->
    	<repository>
        	<id>my-release</id>
            <url>http://localhost:8081/repository/my-release/</url>
        </repository>
        <!-- 临时仓库 -->
        <snapshotRepository>
        	<id>my-snapshots</id>
            <url>http://localhost:8081/repository/my-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>
    
  • 发布资源到私服命令

    mvn deploy
    

3)通过命令访问私服

mvn deploy:deploy-file -Dfile=文件路径  -DgroupId=所属组ID  -DartifactId=项目ID  -Dversion=版本号  -Dpackaging=打包形式 -Durl=上传仓库路径 -DrepositoryId=仓库名称

示例:这里我将一个 kettle 的 jar 包上传到我刚创建好的 my-release 仓库中,命令如下:

(kettle-core-7.1.0.0-12.jar 与命令行在同一级目录)

mvn deploy:deploy-file -Dfile=kettle-core-7.1.0.0-12.jar  -DgroupId=pentaho-kettle  -DartifactId=kettle-core  -Dversion=7.1.0.0-12  -Dpackaging=jar -Durl=http://localhost:8081/repository/my-release -DrepositoryId=my-release

执行结果:

在这里插入图片描述

补充:如何通过命令将 jar 包推到本地仓库

mvn install:install-file -Dfile=文件路径  -DgroupId=所属组ID  -DartifactId=项目名称  -Dversion=版本号  -Dpackaging=打包方式

示例:这里我将一个 kettle 的 jar 包上传到我的本地仓库中,命令如下:

mvn install:install-file -Dfile=kettle-core-7.1.0.0-12.jar  -DgroupId=pentaho-kettle  -DartifactId=kettle-core  -Dversion=7.1.0.0-12  -Dpackaging=jar

执行结果:

在这里插入图片描述

整理完毕,完结撒花~ 🌻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5 <param> 标签、HTML5 <progress> 标签

HTML5 <param> 标签 实例 HTML5 <param>标签为<object>标签提供嵌入内容的运行时参数的name与value对。请参考下述示例&#xff1a; 设置参数 "autoplay" 为 "true"&#xff0c;音频载入后会自动播放&#xff1a; <object data&qu…

基于AT89C51单片机的电子时钟设计

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87695258?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 1.设计出电子数字钟的电路&#xff0c;并用protus进行仿真画出对应的电路图 2.设计出电子数字钟…

2021地理设计组二等奖:基于GIS的东江源区土壤侵蚀及其影响因素空间分析

一、作品背景 水土保持情况普查对我国具有重要意义。我国目前是世界上水土流失最严重的国家之一&#xff0c;水土流失面积极其广且量大&#xff1b;严重的水土流失问题是我国生态环境问题的重要板块&#xff0c;若是持续恶化&#xff0c;将会严重影响我国的生态安全、饮水安全…

不得不说的创建型模式-抽象工厂模式

抽象工厂模式是一种创建型模式&#xff0c;它提供一个接口来创建一系列相关或相互依赖的对象&#xff0c;而不需要指定它们的具体类。这个接口被称为“抽象工厂”&#xff0c;它可以被不同的具体工厂实现来创建不同的产品族。 下面通过一个简单的示例来说明抽象工厂模式的底层原…

[API]string常量池string常用方法StringBuilder类(一)

String字符串类型&#xff1a; java.lang.String类使用final修饰&#xff0c;不能被继承 String的底层封装的是一个字符数组 String在内存中采用Unicode编码格式&#xff0c;每个字符占用2个字节的内存空间 字符串对象一旦创建&#xff0c;对象内容永远无法改变&#xff0c;…

Python爬虫实战——下载小说

Python爬虫实战——下载小说 前言第三方库的安装示例代码效果演示结尾 前言 使用requests库下载开源网站的小说 注意&#xff1a;本文仅用于学习交流&#xff0c;禁止用于盈利或侵权行为。 操作系统&#xff1a;windows10 家庭版 开发环境&#xff1a;Pycharm Conmunity 202…

Node【NPM】

文章目录 &#x1f31f;前言&#x1f31f;NPM使用&#x1f31f;NPM使用场景&#x1f31f;NPM的常用命令&#x1f31f;NPM命令使用介绍&#x1f31f; 使用NPM安装模块&#x1f31f; 下载三方包&#x1f31f; 全局安装VS本地安装&#x1f31f; 本地安装&#x1f31f; 全局安装&am…

Vue全家桶

作为后端对vue学习完的快速总结 目录 1.vue-cli 2 vuex 3 axios 4 router vue-cli vue-cli 3 是基于webpack 4 打造的vue-cli 2 还是 webpack 3webpack是基于node.js的&#xff0c;所以我们在安装脚手架前必须安装node 安装node.js(应用商店或者官网) 1.安装vue脚手架 npm…

Storm proxies动态代理IP抓取产品信息用什么类型的代理呢?

抓取产品信息时&#xff0c;可以根据实际需求和目标网站的反爬虫策略选择合适的代理类型。以下是一些常见的代理类型&#xff1a; HTTP代理&#xff1a;HTTP代理是最常见的代理类型&#xff0c;适用于基于HTTP协议的网站。它可以用于发送HTTP请求和接收HTTP响应&#xff0c;适合…

storm proxies动态HTTP代理IP的三大功能?

动态HTTP代理IP主要具有以下三大功能&#xff1a; 隐私保护&#xff1a;动态HTTP代理IP可以隐藏用户的真实IP地址&#xff0c;将用户的请求发送到目标网站时&#xff0c;目标网站只能看到代理IP地址&#xff0c;而无法知道用户的真实IP地址&#xff0c;从而保护用户的隐私和身份…

665. 非递减数列

给你一个长度为 n 的整数数组 nums &#xff0c;请你判断在 最多 改变 1 个元素的情况下&#xff0c;该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的&#xff1a; 对于数组中任意的 i (0 < i < n-2)&#xff0c;总满足 nums[i] < nums[i 1]。 示例…

第四章(1):词向量定义与意义

第四章&#xff08;1&#xff09;&#xff1a;词向量定义与意义 目录 第四章&#xff08;1&#xff09;&#xff1a;词向量定义与意义前言1. 词的表示1.1 离散表示1.1.1 One-Hot独热编码1.1.2 ngram特征表示 1.2 分布式表示 2. 意义 前言 在自然语言处理的领域中&#xff0c;每…

电容-基础知识

1、电容两端电压 不能激变&#xff0c;所以可以起到稳定电压作用 2、电容的种类&#xff1a;瓷片电容、插件电解电容、贴片电解电容、钽电容、CBB电容、插件瓷片电容、&#xff08;X电容、Y电容&#xff0c;属于安规电容&#xff0c;对功能没有影响&#xff0c;对性能没有影响…

权限控制_SpringSecurity

认证-授权 认证&#xff1a;系统提供的用于识别用户身份的功能&#xff0c;通常提供用户名和密码进行登录其实就是在进行认证&#xff0c;认证的目的是让系统知道你是谁。 授权&#xff1a;用户认证成功后&#xff0c;需要为用户授权&#xff0c;其实就是指定当前用户可以操作…

【Qt】随记1:#if 1/0 #else #endif的用法

欢迎阅读本博文&#xff0c;本文主要记录Qt学习、工作中的一些注意点及相关笔记&#x1f4c3; 希望记录的内容有帮助到你&#xff0c;也欢迎把你知道的分享给大家&#xff0c;一起进步&#xff01;&#x1f389; 喜欢的话&#xff0c;请帮忙点赞&#x1f44d;、评论&#x1f4…

【排序】快速排序(递归和非递归)

快速排序 前言图解大致思路对于hoare版本对于挖坑法对于前后指针法 实现方法递归非递归 快排的优化&#xff08;基于递归的优化&#xff09;三数取中法小区间优化 时间复杂度和空间复杂度 前言 快速排序&#xff0c;听名字就比较霸道&#xff0c;效率根名字一样&#xff0c;非…

winForm登录页面知识点

先看界面 引用知识 控件&#xff1a;label,Textbox,button还有各自的属性和事件Trim()方法的使用&#xff0c;IsNullOrEmpty()方法的使用&#xff0c;Show()方法的使用 Label 属性 NameText:设置或获取文本信息image:显示图像ImageList:图像集控件SizeTag:与控件相关的自定…

Gorm的关联模型

Belongs To 将一个模型与另一个模型建立一对一的关系 例如&#xff1a;一张银行卡只能分配给一个用户&#xff0c;在User结构体里面创建一个CreditCardId外键关系&#xff0c;然后在User结构体里面嵌套一个CreditCard结构体 // Belongs To // 用户 type User struct {gorm.M…

十个超级好用的Javascript技巧

概览&#xff1a;在实际的开发工作过程中&#xff0c;积累了一些常见又超级好用的Javascript技巧和代码片段&#xff0c;包括整理的其他大神的JS使用技巧&#xff0c;今天筛选了10个&#xff0c;以供大家参考。 动态加载JS文件 在一些特殊的场景下&#xff0c;特别是一些库和…

自己动手做chatgpt:解析gpt底层模型transformer的输入处理

前面我们完成了一些基本概念&#xff0c;如果你对深度学习的基本原理还不了解&#xff0c;你可以通过这里获得更多信息&#xff0c;由于深度学习的教程汗牛充栋&#xff0c;因此我在这里不会重复&#xff0c;而是集中精力到chatgpt模型原理的分析&#xff0c;实现和实践上。Cha…