编程技术分享平台

网站首页 > 技术教程 正文

Maven项目依赖管理和构建私有仓库服务器和使用方法

xnh888 2024-10-22 18:11:51 技术教程 22 ℃ 0 评论

# Maven项目依赖管理和构建私有服务器

## 目录

  • 第1章Maven概述
  • 第2章Maven快速入门
  • 第3章Maven基础操作
  • 第4章Maven高手进阶
  • 第5章Maven应用
  • 第6章课程总结

# Maven项目依赖管理和构建私有服务器

## 第1章Maven概述

### 1-1课程概述(02:26)

### 1-2 Maven简介(05:49)

### 1- 3 Maven环境搭建(04:52)

## 第2章Maven快速入门

### 2-1 Maven项目的创建(06:08)

### 2-2第一个依赖和插件(05:57)

### 2- 3运行项目的两种方式(04:57)

### 2-4 Batch Mode问题(03:03)

- 问题:创建Maven项目,挂死在构建项目环节

[ INFO] Generating project in Batch mode

- 原因:防火墙,阻止/延缓了访问在国外的Maven仓库.

- Maven中央仓库国内镜像配置

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>
    http://maven.aliyun.com/nexus/content/groups/public/
    </url>
    <mirrorOf>central</mirrorOf>       
</mirror>

### 2-5 Maven工具和项目的文件结构(06:08)

Maven内建变量

${basedir}表示项目根目录,即包含pom.xml文件的目录;

${version}表示项目版本;

${project.basedir}同${basedir};

${project.baseUri}表示项目文件地址;

${maven.build.timestamp}表示项目构件开始时间;

${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。
 ${project.build.directory}表示主源码路径;

 ${project.build.sourceEncoding}表示主源码的编码格式;

 ${project.build.sourceDirectory}表示主源码路径;

 ${project.build.finalName}表示输出文件名称;

  ${project.version}表示项目版本,与${version}相同;


${project.xxx} 当前pom文件的任意节点的内容
${env.xxx} 获取系统环境变量。
${settings.xxx} 指代了settings.xml中对应元素的值。

## 第3章Maven基础操作

### 3-1 Maven基础操作-仓库(08:54)

- ◆远程仓库/中央仓库

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>
    http://maven.aliyun.com/nexus/content/groups/public/
    </url>
    <mirrorOf>central</mirrorOf>       
</mirror>

- ◆本地仓库

- ◆私有服务器

### 3- 2 Maven配置(13:06)

- 基础组件:配置

- ◆Maven核心组件:配置

- ◆全局配置: settings.xml

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- 本地仓库配置:默认~/.m2/repository[店家推荐修改配置] -->
  <localRepository>${user.home}/.m2/repository</localRepository>

  <!-- 交互方式配置,读取用户输入信息[使用默认即可,很少修改] -->
  <interactiveMode>true</interactiveMode>

  <!-- 是否启用独立的插件配置文件,一般很少启用[默认即可,很少修改] -->
  <usePluginRegistry>false</usePluginRegistry>

  <!-- 是否启用离线构建模式,一般很少修改[如果长时间不能联网的情况下可以修改] -->
  <offline>false</offline>
  
  <!-- 是否启用插件groupId自动扫描[很少使用,配置插件时建议全信息配置] -->
  <pluginGroups>
    <pluginGroup>org.apache.maven.plugins</pluginGroup>
  </pluginGroups>

  <!--配置服务端的一些设置如身份认证信息(eg: 账号、密码) -->
  <servers>
    <!--服务器元素包含配置服务器时需要的信息 -->
    <server>
      <!--这是server的id(注意不是用户登陆的id)
      该id与distributionManagement中repository元素的id相匹配。
      -->
      <id>server_001</id>
      <!--身份鉴权令牌。鉴权/认证用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->
      <username>my_login</username>
      <!--身份鉴权密码 。鉴权/认证用户名和鉴权密码表示服务器认证所需要的登录名和密码-->
      <password>my_password</password>
      <!--鉴权/认证时使用的私钥文件位置。和前两个元素类似
      私钥位置和私钥密码指定了一个私钥的路径(默认是${user.home}/.ssh/id_dsa)-->
      <privateKey>${usr.home}/.ssh/id_dsa</privateKey>
      <!--鉴权/认证时使用的私钥密码。 -->
      <passphrase>some_passphrase</passphrase>
      <!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 -->
      <filePermissions>664</filePermissions>
      <!--目录被创建时的权限。 -->
      <directoryPermissions>775</directoryPermissions>
    </server>
  </servers>

   <mirrors>
    <!-- 默认仓库配置给定的下载镜像位置 -->
    <mirror>
      <!-- 该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
      <id>nexus aliyun</id>
      <!-- 镜像名称 -->
      <name>Nexus Aliyun</name>
      <!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
      <url>http://downloads.planetmirror.com/pub/maven2</url>
      <!-- 被镜像的服务器的id。
      如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像
      就需要将mirrorOf设置成central。
      保持和中央仓库的id central一致。 这样就能替代中央仓库的功能了-->
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>

  <proxies>
    <!--代理元素包含配置代理时需要的信息 -->
    <proxy>
      <!--代理的唯一定义符,用来区分不同的代理元素。 -->
      <id>myproxy</id>
      <!--该代理是否是激活的那个。true则激活代理。当我们声明了一组代理,而某个时候只需要激活一个代理的时候,该元素就可以派上用处。 -->
      <active>true</active>
      <!--代理的协议。 协议://主机名:端口,分隔成离散的元素以方便配置。 -->
      <protocol>http</protocol>
      <!--代理的主机名。协议://主机名:端口,分隔成离散的元素以方便配置。 -->
      <host>proxy.somewhere.com</host>
      <!--代理的端口。协议://主机名:端口,分隔成离散的元素以方便配置。 -->
      <port>8080</port>
      <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 -->
      <username>proxyuser</username>
      <!--代理的密码,用户名和密码表示代理服务器认证的登录名和密码。 -->
      <password>somepassword</password>
      <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。 -->
      <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
    </proxy>
  </proxies>

  <profiles>
    <profile>
      <!-- profile的唯一标识 -->
      <id>test</id>
      <!-- 自动触发profile的条件逻辑 -->
      <activation />
      <!-- 扩展属性列表 -->
      <properties />
      <!-- 远程仓库列表 -->
      <repositories />
      <!-- 插件仓库列表 -->
      <pluginRepositories />
    </profile>
  </profiles>


  <activeProfiles>
    <!-- 要激活的profile id -->
    <activeProfile>env-test</activeProfile>
  </activeProfiles>

  <activation>
    <!--profile默认是否激活的标识 -->
    <activeByDefault>false</activeByDefault>
    <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。 -->
    <jdk>1.5</jdk>
    <!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 -->
    <os>
      <!--激活profile的操作系统的名字 -->
      <name>Windows XP</name>
      <!--激活profile的操作系统所属家族(如 'windows') -->
      <family>Windows</family>
      <!--激活profile的操作系统体系结构 -->
      <arch>x86</arch>
      <!--激活profile的操作系统版本 -->
      <version>5.1.2600</version>
    </os>
    <!--如果Maven检测到某一个属性(其值可以在POM中通过${name}引用),其拥有对应的name = 值,Profile就会被激活。如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 -->
    <property>
      <!--激活profile的属性的名称 -->
      <name>mavenVersion</name>
      <!--激活profile的属性的值 -->
      <value>2.0.3</value>
    </property>
    <!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。 -->
    <file>
      <!--如果指定的文件存在,则激活profile。 -->
      <exists>${basedir}/file2.properties</exists>
      <!--如果指定的文件不存在,则激活profile。 -->
      <missing>${basedir}/file1.properties</missing>
    </file>
  </activation>

<properties>
  <spring.Version>5.2.8</spring.Version>
</properties>

<repositories>
  <!--包含需要连接到远程仓库的信息 -->
  <repository>
    <!--远程仓库唯一标识 -->
    <id>codehausSnapshots</id>
    <!--远程仓库名称 -->
    <name>Codehaus Snapshots</name>
    <!--如何处理远程仓库里发布版本的下载 -->
    <releases>
      <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
      <enabled>false</enabled>
      <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
      <updatePolicy>always</updatePolicy>
      <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 -->
      <checksumPolicy>warn</checksumPolicy>
    </releases>
    <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 -->
    <snapshots>
      <enabled />
      <updatePolicy />
      <checksumPolicy />
    </snapshots>
    <!--远程仓库URL,按protocol://hostname/path形式 -->
    <url>http://snapshots.maven.codehaus.org/maven2</url>
    <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 -->
    <layout>default</layout>
  </repository>
</repositories>

</settings>

- ◆项目配置: pom.xml .

考虑到阅读体验,只展示了前100行,一共766行,查看或者翻阅所有请异步

https://gitee.com/zeus-maker/hunter/blob/master/build-tools/Maven/conf/pom_sample.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <!-- 
    1、项目基本信息配置
    
    -->
    <!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。 -->  
    <parent>  
        <!--被继承的父项目的构件标识符 -->  
        <artifactId />  
        <!--被继承的父项目的全球唯一标识符 -->  
        <groupId />  
        <!--被继承的父项目的版本 -->  
        <version />  
        <!--父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。 -->  
        <relativePath />  
    </parent>  
    <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 -->  
    <modelVersion>4.0.0</modelVersion>  
    <!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app -->  
    <groupId>asia.banseon</groupId>  
    <!--构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个特定的group   
        ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源码,二进制发布和WARs等。 -->  
    <artifactId>banseon-maven2</artifactId>  
    <!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 -->  
    <packaging>jar</packaging>  
    <!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 -->  
    <version>1.0-SNAPSHOT</version>  
    <!--项目的名称, Maven产生的文档用 -->  
    <name>banseon-maven</name>  
    <!--项目主页的URL, Maven产生的文档用 -->  
    <url>http://www.baidu.com/banseon</url>  
    <!--项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标签),   
        不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。 -->  
    <description>A maven project to study maven.</description> 
    <!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->  
    <inceptionYear />  
    <!--项目相关邮件列表信息 -->  
    <mailingLists>  
        <!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->  
        <mailingList>  
            <!--邮件的名称 -->  
            <name>Demo</name>  
            <!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
            <post>Demo@126.com</post>  
            <!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
            <subscribe>Demo@126.com</subscribe>  
            <!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->  
            <unsubscribe>Demo@126.com</unsubscribe>  
            <!--你可以浏览邮件信息的URL -->  
            <archive>http://localhost:8080/demo/dev/</archive>  
        </mailingList>  
    </mailingLists>  
    <!--项目开发者列表 -->  
    <developers>  
        <!--某个项目开发者的信息 -->  
        <developer>  
            <!--SCM里项目开发者的唯一标识符 -->  
            <id>HELLO WORLD</id>  
            <!--项目开发者的全名 -->  
            <name>youname</name>  
            <!--项目开发者的email -->  
            <email>youname@qq.com</email>  
            <!--项目开发者的主页的URL -->  
            <url />  
            <!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->  
            <roles>  
                <role>Project Manager</role>  
                <role>Architect</role>  
            </roles>  
            <!--项目开发者所属组织 -->  
            <organization>demo</organization>  
            <!--项目开发者所属组织的URL -->  
            <organizationUrl>http://www.xxx.com/</organizationUrl>  
            <!--项目开发者属性,如即时消息如何处理等 -->  
            <properties>  
                <dept>No</dept>  
            </properties>  
            <!--项目开发者所在时区, -11到12范围内的整数。 -->  
            <timezone>+8</timezone>  
        </developer>  
    </developers>  
    <!--项目的其他贡献者列表 -->  
    <contributors>  
        <!--项目的其他贡献者。参见developers/developer元素 -->  
        <contributor>  
            <name />  
            <email />  
            <url />  
            <organization />  
            <organizationUrl />  
            <roles />  
            <timezone />  
            <properties />  
        </contributor>  
    </contributors>  

- 优先级

- pom.xml>settings.xmlnote>setting.xml

- 项目配置>用户配置>全局配置

- 1、项目基础信息配置

- 2、项目构建环境配置

- 3、项目仓库管理配置

- 4、项目依赖管理配置

- 5、项目报表信息配置

- 6、项目部署分发配置

### 3- -3 Maven软件坐标(06:25)

- 基础组件: gav坐标

- ◆groupld: 项目ID,当前项目和其他项目的唯一标志.

- ◆artifactld:组件ID,当前项目中的子应用或者子组件的唯一标志 .

- ◆version: 版本号,迭代开发时标志的产品版本信息

- 扩展:版本号的意义

- 软件名称.主版本号.小版本号.阶段版本号.字母版本号

### 3- -4 Maven操作命令(08:28)

### 3- -5 Maven生命周期(04:00)

- 基础组件:生命周期

- ◆clean lifecycle: 项目构建之前的清理环节

- ◆default lifecycle:项目编译和打包环节

- ◆site lifecycle: 项目报告、站点信息、发布环节

### 3- -6手工构建Maven项目(07:37)

### 3-7 MVN命令构建Maven项目(04:16)

### 3- -8使用工具构建Maven项目(03:29)

### 3- -9 archetype项目骨架加载慢的问题(02:57)

### 3- -10自定义archetype项目骨架解决servlet版本问题(06:39)

## 第4章Maven高手进阶

### 4-1 Maven依赖范围管理(06:41)

- ◆什么是依赖范围?

- ◆都有哪些依赖范围?

- ◆为什么 要设置依赖范围?

### 4-2 Maven父子项目依赖传递(12:13)

- ◆什么是父子项目?

- ◆父项目 的依赖?

- ◆子项目的依赖?

### 4- -4 Maven项目常见插件(10:28)

- ◆什么是插件?

- ◆生命周期插件? .

resources/source/clean/compile

- ◆常用操作插件?

tomcat7/denpendency/jar/..

maven-antrun-plugin
maven-archetype-plugin
maven-assembly-plugin
maven-dependency-plugin
maven-enforcer-plugin
maven-help-plugin
maven-release-plugin
maven-resources-plugin
maven-surefire-plugin
build-helper-maven-plugin
exec-maven-plugin
jetty-maven-plugin
versions-maven-plugin

### 4-5 Nexus私有服务器-搭建私有服务器(06:50)

  1. 下载网址:https://www.sonatype.com/products/repository-oss-download
  2. Mac本地测试直接使用
brew install nexus

### 4-6 Nexus私有服务器-创建私有仓库(05:50) .

### 4-7 Nexus私有服务器- _依赖下载和项目发布(11:13)

## 第5章Maven应用

### 5-1 Maven构建JavaSE项目(04:11)

- ◆JavaSE项目的特点

- ◆Intellij IDEA构建基于Maven的JavaSE项目

- ◆JavaSE项目运行的两种方式

### 5-2 Maven构建JavaWEB项目(11:04)

### 5-3 Maven依赖直接冲突的问题(06:27)

<exclusions>
  <exclusion>
    <groupId>组名</ groupId>
    <artifactId>冲突的包名</artifactId>
  </exclusion>
</ exclusions>

### 5- -4 Maven依赖传递冲突的问题(06:08)

## 第6章课程总结

### 6-1课程总结(02:10)

- Maven基础

- 环境搭建,文件结构

- ◆项目构建,配置梳理

- ◆仓库,坐标、命令和生命周期

- Maven高级

- ◆>项目依赖的范围管理

- ◆父子项目的传递、聚合项目的管理

- 私有服务器的构建使用

- Maven应用

- ◆增强项目功能的插件

- ◆不同类型项目的构建

- ◆解决项目中的依赖冲突

## 参考资料

- [Maven项目依赖管理](https://www.imooc.com/learn/1282)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表