Maven学习笔记+私服搭建

Posted dingwen_blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven学习笔记+私服搭建相关的知识,希望对你有一定的参考价值。

官网:http://maven.apache.org/

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务 于 Java 平台的项目构建和依赖管理。

一、install

官网下载指定平台的版本,以windows为例。注意:maven依赖java环境,系统需要配置了JAVA_HOME

  • 下载.zip文件

  • 解压缩

    • apache-maven-version
      • bin: maven可执行命令
      • boot
      • conf: 配置文件
      • lib
      • LICENSE
      • NOTICE
      • README.txt
  • 配置环境变量: 把解压缩的目录/bin放到系统变量path

    • 创建系统环境变量:M2_HOME 或者MAVEN_HOME
    • path中新增:%M2_HOME%\\bin
  • 验证安装:mvn -v

C:\\Users\\Administrator>mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
Maven home: D:\\file\\apache-maven-3.5.0\\bin\\..
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: C:\\Program Files\\Java\\jdk1.8.0_121\\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

二、maven 基础

2.1 约定的目录结构

  • 项目文件夹
    • src 源代码目录
      • main 主程序目录
        • java 代码
        • resources 配置文件
      • test 测试
        • java 测试代码
        • resources 测试配置文件
    • pom.xml maven核心配置文件

2.2 Project Object Model(POM)

项目对象模型,maven通过pom.xml文件实现 项目的构建和依赖的管理

2.3 gav(坐标)

  • groupId:组织名称
  • arfiiacId:项目名称
  • version: 版本号
  • package: jar || war || ear || pom

使用组织名称、项目名称、版本号唯一确定一个资源

2.4 dependency(依赖)

项目中要使用的其他资源(jar)。
需要使用maven表示依赖,管理依赖。 通过使用dependency和gav一起完成依赖的使用。需要在pom.xml文件中,使用dependencies 和dependency, 还有gav 完成依赖的说明。maven使用gav作为标识,从互联网下载依赖的jar。 下载到你的本机上。 由maven管理项目使用的这些jar

<dependencies>
    <!-- 日志 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies> 

2.5仓库

存放工具包的

  • 本地仓库: 默认路径:操作系统的账号的目录中/.m2/repository

2.5.1 修改默认路径

1.创建仓库路径(非中文、非空格)
2.修改配置文件maven安装目录/conf/setting.xml
3. <localRepository>你创建的目录</localRepository>
  • 远程仓库
    1.中央仓库:一个ftp服务器,存放着所有的资源
    2.中央仓库镜像:中央仓库的拷贝,各大城市都有
    3.私服:局域网内自己的仓库

  • 工作方式
    maven使用仓库: maven自动使用仓库, 当项目启动后, 执行了maven的命令, maven首先访问的是本地仓库, 从仓库中获取所需的jar, 如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像

2.6生命周期

  • clean(清理):mvn clean 删除之前编译的生成的target目录
  • compile(编译):mvn compile 代码编译
  • test(测试):mvn test 执行编译成功的测试字节码文件
  • package(打包):mvn package
  • verify(认证):mvn verify 认证
  • install(安装): mvn install将打包的文件安装到本地仓
  • site(站点):mvn site生成站点
  • deploy(部署):mvn deploy 将项目安装到远程仓库,并运行在web容器中

2.7 自定义配置插件

> 在pom.xml文件中, build标签中。设置插件
<!-- 设置构建项目相关的内容 -->

<build>
  <plugins>
    <!-- 设置插件 -->
	<plugin>
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<version>3.8.1</version>
		<configuration>
			<source>1.8</source> <!-- 指定编译代码的jdk版本 -->
			<target>1.8</target> <!-- 运行java程序使用的jdk版本-->
		</configuration>
	</plugin>
  </plugins>
</build>

三、依赖管理

  • scope(依赖的范围)
    • compile (默认,参与构建项目的所有阶段)
    • test (只在测试阶段依赖,例:junit)
    • provided(提供者:在项目部署到服务器时不需要这个依赖,有服务器提供。例:jsp、servlet)

四、常用设置

properties

  • 作为全局变量使用

  • 步骤

    • properties中定义
    • ${变量名}引用
    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <!--编译JDK版本-->
      <maven.compiler.source>1.8</maven.compiler.source>
          <!--运行JDK版本-->
      <maven.compiler.target>1.8</maven.compiler.target>
      	 <!--自定义变量-->
      <spring.version>5.2.5.RELEASE</spring.version>
    </properties>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    

    五、资源插件的使用

资源插件用来处理配置文件,我们知道maven会把所有/src/main/resources/中的文件拷贝到/target/classes/下,把/src/main/java/中的所有.java文件编译为.class文件拷贝到/target/classes/中。

<build>
  <!--资源插件
      告诉maven把 src/main/java目录中的
      指定扩展名的文件 拷贝到 target/classes目录中。
  -->
  <resources>
    <resource>
      <directory>src/main/java</directory><!--所在的目录-->
      <includes>
      <!--包括目录下的.properties,.xml 文件都会扫描到-->
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
        <!--  filtering 选项 false 不启用过滤器, *.property 已经起到过
        滤的作用了 -->
      <filtering>false</filtering>
    </resource>
  </resources>
</build>

六、idea中使用maven

6.1 初始项目设置

在这里插入图片描述

设置项: -DarchetypeCatalog=internal

在这里插入图片描述

6.2 新项目默认设置

在这里插入图片描述

6.3 使用模板创建项目

在这里插入图片描述

七、maven高级

7.1 依赖传递

maven中你在pom.xml中直接导入坐标,则这个资源为该项目的直接依赖。如果这个资源也依赖一些其他资源,也会被maven下载。这里的其他资源就是间接依赖。这个过程叫做依赖传递。

7.2依赖优先原则

  • 1.第一声明者优先:在pom.xml中定义依赖,先定义的为准
  • 2.路径近者优先: 例如当两个资源都依赖同一个资源时,此时在pom.xml文件中声明这个依赖资源的路径就更近。

7.3 排除依赖

在这里插入图片描述

7.4 锁定版本

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。

注意:在工程中锁定了版本并没有添加依赖,后面添加依赖的时候可以不写版本号。

在这里插入图片描述

7.5 tomcat插件

<!-- 添加tomcat7插件 -->
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
        </plugin>
      </plugins>
    </build>

7.6 父子工程启动

如果父子工程都是单独可运行的项目,直接启动父工程可以完成启动。当你单独启动某一个模块时,如果当前模块依赖于其他模块此时仓库中并没有这个模块的jar包,此时就需要先将所依赖的模块mvn install

7.7 依赖范围对传递依赖的影响

是因为依赖会有依赖范围,依赖范围对传递依赖也有影响,例如有 A、B、C,A 依赖 B、B
依赖 C,C 可能是 A 的传递依赖,如下图:

在这里插入图片描述

最左边一列为直接依赖,理解为 A 依赖 B 的范围,最顶层一行为传递依赖,理解为 B
依赖 C 的范围,行与列的交叉即为 A 传递依赖 C 的范围。

7.8 继承

继承是为了消除重复,如果将 dao、service、web 分开创建独立的工程则每个工程的 pom.xml文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的配置提取出来在父工程的 pom.xml 中定义。

7.9 聚合

项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在
一起运行,比如:dao、service、web 三个工程最终会打一个独立的 war 运行。

7.10 搭建私服环境

7.10.1 下载地址

https://www.sonatype.com/

7.10.2 Docker 安装

https://blog.csdn.net/qq_38020915/article/details/117514387

在这里插入图片描述

7.10.3 仓库类型

  • hosted: 本地仓库
    • releases: 发行版
    • snapshots: 快照版
    • 3rd party: 第三方库
  • proxy: 代理仓库,代理远程的公共仓库
  • group: 仓库组,用来合并多个hosted、proxy

7.10.4 部署到私服

  • 配置

    <properties>
            <nexus.base.server>http://192.168.233.130:8888</nexus.base.server>
        </properties>
    
    
        <distributionManagement>
            <repository>
                <id>maven-releases</id>
                <url>${nexus.base.server}/repository/maven-releases/</url>
            </repository>
            <snapshotRepository>
                <id>maven-snapshots</id>
                <url>${nexus.base.server}/repository/maven-snapshots/</url>
            </snapshotRepository>
        </distributionManagement>
    
  • maven 配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    
    <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 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    	<!-- 本地仓库的路径。默认值为${user.home}/.m2/repository。 -->
    	<localRepository>E:/repositoryNew</localRepository>
    
    	<pluginGroups>
    		<pluginGroup>org.codehaus.cargo</pluginGroup>
    	</pluginGroups>
    	
    	
    <servers>  
    		<server>
    			 <id>maven-releases</id>
    			 <username>admin</username>
    			 <password>123456</password>
    		 </server>
    		<server>
    			 <id>maven-snapshots</id>
    			 <username>admin</username>
    			 <password>123456</password> 
    		 </server>
    		 
    		 <!--第三方jar导入-->
    		 <server>
    		 <id>thirdparty</id>
    		 <username>admin</username>
    		 <password>123456</password>
    		</server>
    
      </servers>  
    
      <!--备选镜像配置-->
      <mirrors>
    		<!-- 阿里云 -->
    		<mirror>
    			<id>alimaven</id>
    			<name>aliyun maven</name>
    			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    			<mirrorOf>central</mirrorOf>
    		</mirror>
    		<!-- 华为云 -->
    		  <mirror>
    		   <id>huaweicloud</id>
    		   <mirrorOf>*</mirrorOf>
    		   <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    		  </mirror>
    		  
    		  <mirror>
    			  <id>maven-releases</id>
    			  <mirrorOf>*</mirrorOf>
    			  <url>http://192.168.233.130:8888/repository/maven-releases/</url>
    		  </mirror>
    		  
    		  <mirror>
    			  <id>maven-snapshots</id>
    			  <mirrorOf>*</mirrorOf>
    			  <url>http://192.168.233.130:8888/repository/maven-snapshots/</url>
    		  </mirror>
      </mirrors>
      
      
      <profiles>
    		<profile>
    			<!--profile 的 id-->
    			 <id>dev</id>
    			 <repositories>
    			 <repository>
    			<!--仓库 id,repositories 可以配置多个仓库,保证 id 不重复-->
    			 <id>nexus</id> 
    			<!--仓库地址,即 maven-snapshots 仓库组的地址-->
    			<url>http://192.168.233.130:8888/repository/maven-public/</url>
    			<!--是否下载 releases 构件-->
    			 <releases>
    			 <enabled>true</enabled>
    			 </releases>
    			<!--是否下载 snapshots 构件-->
    			 <snapshots>
    			 <enabled>true</enabled>
    			 </snapshots>
    			 </repository>
    			 </repositories>
    			<pluginRepositories>
    			 <!-- 插件仓库,maven 的运行依赖插件,也需要从私服下载插件 -->
    			 <pluginRepository>
    			 <!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 -->
    			 <id>public</id>
    			 <name>Public Repositories</name>
    			<url>http://192.168.233.130:8888/repository/maven-public/</url>
    			 </pluginRepository>
    			 </pluginRepositories>
    		</profile> 
    	</profiles>
    	<activeProfiles>
    		<activeProfile>dev</activeProfile>
    	</activeProfiles>
    </settings>
    
    
  • 上传直接去第三方直接去管理端操作,server指定第三方用户

  • 下载根据以上配置引入坐标即可

在这里插入图片描述

以上是关于Maven学习笔记+私服搭建的主要内容,如果未能解决你的问题,请参考以下文章

Maven学习 使用Nexus搭建Maven私服

Maven学习 使用Nexus搭建Maven私服

Maven学习 使用Nexus搭建Maven私服

Maven学习 使用Nexus搭建Maven私服(转)

maven学习(中)- 私服nexus搭建

Maven学习二:使用Nexus搭建Maven私服及相关配置