04_1_Maven

作者:codejiwei

日期:2020-09-26

1 Maven定义

2.1 自动化构建工具

Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。在JavaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁:Make→Ant→Maven→Gradle→其他……

2.2 构建的概念

  1.   清理:删除以前的编译结果,为重新编译做好准备。
    
  2.   编译:将Java源程序编译为字节码文件。
    
  3.   测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
    
  4.   报告:在每一次测试后以标准的格式记录和展示测试结果。
    
  5.   打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
    
  6.   安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
    
  7.   部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
    

2 Maven如何使用

2.1 安装Maven核心程序

解压Maven的核心程序。

将apache-maven-3.5.4-bin.zip解压到一个非中文无空格的目录下。

2.2 配置环境变量

  • 首先检查jdk的环境变量

    检查JAVA_HOME环境变量。Maven是使用Java开发的,所以必须知道当前系统环境中JDK的安装目录。

    版本要求:JDK1.8 + Maven3.5.4

  • 配置Maven的环境变量

    %MAVEN_HOME%\bin

  • 查看Maven版本信息验证安装状态

    C:\Users\Administrator>mvn -v
    Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
    Maven home: E:\apache-maven-3.5.4\bin\..
    Java version: 1.8.0_45, vendor: Oracle Corporation, runtime: E:\java\jdk1.8.0_45\jre
    Default locale: zh_CN, platform encoding: GBK
    OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
    

2.3 Maven配置

Maven的核心配置文件 settings.xml
  • 配置本地仓库

    设置settings.xml内的localRepository

    以及准备好的仓库位置

  • 配置阿里与镜像

    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    
  • 为了在IDEA中不用总是指定jdk版本,需要在settings.xml中配置固定的jdk版本

    <profiles>
    <profile>
    		<id>jdk-1.8</id>
    		<activation>
    			<activeByDefault>true</activeByDefault>
    			<jdk>1.8</jdk>
    		</activation>
    		<properties>
    			<maven.compiler.source>1.8</maven.compiler.source>
    			<maven.compiler.target>1.8</maven.compiler.target>
    			<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    		</properties>
    </profile>
    </profiles>
    

2.4 第一个Maven工程(手动)

  • 第一步:创建约定的目录结构
Hello
		-src
				-main(目录用于存放主程序)
						-java(目录用于存放源代码文件)
						-resource(目录用于存放配置文件和资源文件)
				-test(目录用于存放测试程序)
						-java
						-resource
		-pom.xml
  • 第二步:配置Maven的核心配置文件pom.xml
<?xml version="1.0" ?>
<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">
	<modelVersion>4.0.0</modelVersion>
    
	<groupId>com.atguigu.maven</groupId><!--公司或组织的域名倒序+当前项目名称-->
	<artifactId>Hello</artifactId><!--当前项目的模块名称-->
	<version>0.0.1-SNAPSHOT</version><!--当前模块的版本-->
	<!--给当前的Hello依赖取名字为hello-->
	<name>hello</name>

	<dependencies><!--jar包依赖-->
        <!--导入junit的jar包-->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.0</version>
			<scope>test</scope>
		</dependency>
         <!--导入commons-logging的jar包-->
        <dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.1.1</version>
		</dependency>
	</dependencies>
</project>
  • 第三步:编写主程序

    • 在mian中编写主程序

    在src/main/java/com/atguigu/maven目录下新建文件Hello.java

package com.atguigu.maven;
public class Hello {
	public String sayHello(String name){
		return "Hello "+name+"!";
	}
}
  • 第四步:编写测试代码

    • 在test中编写测试程序

    在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java

package com.atguigu.maven;	
	import org.junit.Test;
	import static junit.framework.Assert.*;
	public class HelloTest {
		@Test
		public void testHello(){
			Hello hello = new Hello();
			String results = hello.sayHello("atguigu");
			assertEquals("Hello atguigu!",results);	
		}
	}
  • 第五步:运行几个基本的Maven命令

在pom.xml文件所在的路径下,打开cmd

cmd 中录入 mvn compile命令, 查看根目录变化

cmd 中录入 mvn test-compile命令, 查看target目录的变化

cmd 中录入 mvn test命令,查看target目录变化

cmd 中录入 mvn package命令,查看target目录变化

cmd 中录入 mvn install命令, 查看本地仓库的目录变化

2.5 IDEA中配置Maven

  • 第一步:Settings中找到Maven进行配置

1601024151354

  • 第二步:配置Maven自动导入依赖的jar包
  • Import Maven projects automatically:表示 IntelliJ IDEA 会实时监控项目的 pom.xml 文件,进行项目变动设置,勾选上。

  • Automatically download:在 Maven 导入依赖包的时候是否自动下载源码和文档。默认是没有勾选的,也不建议勾选,原因是这样可以加快项目从外网导入依赖包的速度,如果我们需要源码和文档的时候我们到时候再针对某个依赖包进行联网下载即可。IntelliJ IDEA 支持直接从公网下载源码和文档的。

  • VM options for importer:可以设置导入的参数。一般这个都不需要主动改,除非项目真的导入太慢了我们再增大此参数。

1601024338173

2.6 IDEA中创建Maven

  • 第一步:创建new Module —> Maven

  • 第二步:配置坐标:

    1601038570503

  • Maven的文件目录

    1601038832789

  • Maven的编译指令

    也可以在Terminal的控制台上也可以手写输入操作指令如:

    mvn compile | mvn clean | mvn test | mvn package | mvn install

    1601038889206

3 Maven的核心概念

  • POM
  • 约定的目录结构
  • 坐标
  • 依赖
  • 仓库
  • 生命周期
  • 插件和目标
  • 继承
  • 聚合

3.1 POM

Project Object Model:项目对象模型,也就是Maven中的pom.xml文件

3.2 约定的目录结构

约定>配置>编码

3.3 坐标

使用如下三个向量在Maven的仓库中唯一的确定一个Maven工程。

[1]groupId:公司或组织的域名倒序+当前项目名称

[2]artifactId:当前项目的模块名称

[3]version:当前模块的版本

	<groupId>com.atguigu.maven</groupId>
	<artifactId>Hello</artifactId>
	<version>0.0.1-SNAPSHOT</version>

3.4 依赖管理

依赖管理
  • (1)当Ajar包需要用到Bjar包中的类的时候,就是A对B有依赖

  • (2)依赖的基本格式

    <dependency>
        <!--坐标-->
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.0</version>
        <!--依赖的范围-->
        <scope>test</scope>
    </dependency>
    

    依赖的范围有三种

    compile(默认):main、test、部署在Tomcat时要放在WEB-INF的lib目录下

    test:只能在test中访问

    provided:main、test、部署在Tomcat时不会放在WEB-INF的lib目录下

  • (3)依赖分为:直接依赖和间接依赖

  • (4)依赖的原则:

    最短路径优先原则

    路径相同时声明者优先

  • (5**)依赖的排除**

    对于下面的第二个Maven工程中HelloFriend直接依赖Hello的时候,间接依赖了junit和commons-logging,如果HelloFriend不需要commons-logging这个依赖。那么可以排除依赖。

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.atguigu.maven</groupId>
        <artifactId>HelloFriend</artifactId>
        <version>1.0-SNAPSHOT</version>
        
        <dependencies>
            <dependency>
                <!--导入Hello的依赖-->
                <groupId>com.atguigu.maven</groupId>
                <artifactId>Hello</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <!--排除间接依赖的commons-logging-->
                <exclusions>
                    <exclusion>
                        <groupId>commons-logging</groupId>
                        <artifactId>commons-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </project>
    
  • (6)统一管理目标jar包的版本

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>
    

    对于Spring包的jar包依赖,我们导入的版本应该一致,如果对于版本的统一,可以使用如下的操作进行统一管理。

    <!--统一管理当前模块的jar包的版本-->
    <properties>
        <spring.version>4.0.0.RELEASE</spring.version>
    </properties>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    
第二个Maven工程
  • 第一步:首先创建Maven的HelloFriend Module

  • 第二步:在pom.xml配置文件中配置当前工程的依赖Hello

    • 需要注意的是:此时的Hello的pom.xml的配置文件见2.4。

      这个时候因为导入了Hello,所以Hello是当前工程的直接依赖,而因为Hello它又依赖了junit和commons-logging,所以junit和commons-logging是当前工程的间接依赖

    • 另一个问题是:当前的HelloFriend工程是从哪里找到Hello的呢?

      答案是 本地仓库。去本地仓库找它所依赖的jar包。

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.atguigu.maven</groupId>
    <artifactId>HelloFriend</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <!--导入Hello的依赖-->
            <groupId>com.atguigu.maven</groupId>
            <artifactId>Hello</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
  • 第三步:在main中的HelloFriend中编写如下代码:
package com.atguigu.maven;
public class HelloFriend {
    public String sayHelloToFriend(String name){
        Hello hello = new Hello();
        String str = hello.sayHello(name)+" I am "+this.getMyName();
        return str;
    }
    public String getMyName(){
        return "Idea";
    }
}
  • 在test中的HelloFriendTest中编写如下代码:
package com.atguigu.maven;
import org.junit.Test;
public class HelloFriendTest {
    @Test
    public void testHelloFriend(){
        HelloFriend helloFriend = new HelloFriend();
        String results = helloFriend.sayHelloToFriend("Maven");
        System.out.println(results);
    }
}

3.5 仓库

  • 本地仓库
  • 远程仓库
    • 私服:一般是局域网环境下,为所有局域网范围内的Maven工程服务。
    • 中央仓库:架设在Internet上,为全世界的Maven工程服务。
    • 中央仓库的镜像

1601043337243

3.6 生命周期

Clean Lifecycle在进行真正的构建之前进行一些清理工作。

clean生命周期:clean

Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。

compile:编译源代码

test-compile:编译测试源代码

test:进行单元测试,不会被打包或部署

package:将编译好的代码,打包成jar

install,将包安装在本地仓库,可以使用该依赖

Site Lifecycle生成项目报告,站点,发布站点。

3.7 插件和目标

  1.   Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
    
  2.   每个插件都能实现多个功能,每个功能就是一个插件目标。
    
  3.   Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
    

例如:compile就是插件maven-compiler-plugin的一个功能;pre-clean是插件maven-clean-plugin的一个目标。

3.8 继承

继承的方式一:平行的module

显示的在平行的Maven的module的pom.xml核心配置文件中加入如下的代码:

缺点是:还需要显示的生命parent然后还要手动添加relativePath,太麻烦。正式的开发使用方式二。

<!--继承-->
<parent>
    <groupId>com.atguigu.maven</groupId>
    <artifactId>Parent</artifactId>
    <version>1.0-SNAPSHOT</version>
<!--指定从当前pom.xml文件出发寻找父工程的pom.xml文件的相对路径-->
<relativePath>../Parent/pom.xml</relativePath>
</parent>

除此之外,还需要在父类中加入modules!!!为什么见聚合!

继承的方式二:自动的子类module

自动在父maven的module文件上new一个子类maven工程

1601044469856

这个时候自动的会在父module中添加:打包方式pom,聚合modules

    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>HelloSom</module>
    </modules>

3.9 聚合

为什么要使用聚合?

将多个工程分为模块后,比如HelloFriend依赖了Hello,这个时候如果本地仓库中没有Hello的jar包。那么直接install HelloFriend工程就会错误。因为缺少依赖。

1601045280728

注意了!!!

  • 如果想打包HelloFriend,需要将Hello和HelloFriend同时继承于一个父module Parent,对父module打包。可以将HelloFriend和Hello同时打包。

  • 聚合的前提是具备继承关系!!!

  • 父类必须具备的要素有:

    • pom

    •     <modules>
              <module>../Hello</module>
              <module>../HelloFriend</module>
          </modules>
      
  • 如果Hello即是父module又是子module,那么这样一定不能打包!

    原因是:父module要求是打包格式必须是pom格式,而子module要求的打包格式不能是pom格式

4 通过Maven创建Web工程

  • 步骤一:创建简单的Maven工程,打包方式为war包
<groupId>com.atguigu.maven</groupId>
<artifactId>MavenWeb</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
  • 步骤二:点击Project Structure
  • 步骤三:选择对应的Module,添加web目录

1601050915059

  • 步骤四:设置目录名称

1601050946343

  • 步骤五:在web目录下创建index.jsp页面

1601050979872

  • 步骤六:部署到Tomcat上运行

5 出现的问题

5.1 Error:(3, 30) java: 程序包com.alibaba.druid.pool不存在

idea中通过maven已经导入了包,idea中也能定位到包的位置,但在编译的时候始终报error,找不到包。
推测原因是idea的版本与maven构建的build不相容
解决办法如下:
将idea的构建和运行托管到maven下面:
勾选上图选项在重启idea就可以正常运行项目了。

0a51e15320a6f477ac1565cfc83b7fa3.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,以下是在M1 MacBook上安装和配置Maven的步骤: 1. 首先,你需要安装Homebrew。打开终端并运行以下命令: ``` /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 2. 然后,使用Homebrew安装Maven。在终端中运行以下命令: ``` brew install maven ``` 3. 等待安装完成后,验证Maven是否正确安装。在终端中运行以下命令: ``` mvn -version ``` 如果安装成功,你应该会看到类似于以下内容的输出: ``` Apache Maven 3.8.4 (ea04b570a453b0fcd307af0f746324c2b2f420b0) Maven home: /usr/local/Cellar/maven/3.8.4/libexec Java version: 17.0.1, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home Default locale: en_US, platform encoding: UTF-8 OS name: "mac os x", version: "12.1", arch: "x86_64", family: "mac" ``` 这表明Maven已经成功安装并可以使用了。 希望这可以帮助你在M1 MacBook上安装和配置Maven。如果你有任何其他问题,请随时问我。 ### 回答2: M1 Macbook是苹果公司新推出的一款装备了自主研发芯片的电脑。如果要在M1 Macbook上安装配置maven,需要按以下步骤进行操作。 1. 安装Homebrew 要在M1 Macbook上安装maven,首先需要安装Homebrew。Homebrew是一款包管理器,可以简化安装软件的过程。 在终端中输入以下指令,进行安装: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装完成后,可以通过以下指令更新Homebrew: brew update 2. 安装Java maven是基于Java的工具,所以需要在M1 Macbook上安装Java。可以通过以下指令安装Java: brew install --cask java 安装完成后,可以通过以下指令检查Java版本: java -version 3. 安装maven 使用以下指令安装maven: brew install maven 安装完成后,可以通过以下指令检查maven版本: mvn -v 4. 配置环境变量 为了方便使用maven命令,在安装完成后需要将maven添加到环境变量中。具体做法是在命令行窗口中输入以下命令: echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile source ~/.bash_profile 5. 验证安装 最后,可以通过创建一个简单的Java项目,使用maven编译和运行该项目来验证maven安装是否成功。在终端中进入一个目录,使用以下命令创建一个新的Java项目: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 此命令将创建一个包含简单Java代码的项目。使用以下命令编译和运行该项目: cd my-app mvn package java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App 如果程序能够顺利运行,表明maven已经安装并配置好了。 以上是在M1 Macbook上安装配置maven的具体步骤。需要注意的是,由于M1芯片架构与传统的x86芯片结构不同,可能存在一些兼容性问题,需要用Rosetta 2模拟器来运行。如果出现问题,可以尝试在终端中输入以下命令,启用Rosetta 2模拟器: /usr/sbin/softwareupdate --install-rosetta --agree-to-license ### 回答3: 在M1 MacBook上安装配置Maven,需要进行以下几个步骤: 第一步:安装Homebrew Maven是一个Java工具,因此需要先安装Java运行时环境。而在M1 MacBook上,可以使用Homebrew进行安装。Homebrew是一款Mac上的包管理器,可以通过简单的命令来安装和卸载软件包。 打开终端,输入以下命令: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 该命令将下载并安装Homebrew。 第二步:安装Java 在安装Maven之前,需要先安装Java。M1 MacBook上的Java版本有所不同,因此需要安装适配M1芯片的Java版本。 打开终端,输入以下命令: brew install --cask adoptopenjdk 该命令将安装适配M1芯片的Java版本。 第三步:安装Maven 完成Java的安装后,可以开始安装Maven。 打开终端,输入以下命令: brew install maven 该命令将下载并安装Maven。 第四步:配置Maven环境变量 安装完成后,需要配置Maven环境变量,这样才能在终端上使用Maven命令。 打开终端,输入以下命令: vi ~/.zshrc 打开.zshrc文件,将以下命令加入到文件末尾: export MAVEN_HOME=/usr/local/Cellar/maven/{版本号}/libexec export PATH=$MAVEN_HOME/bin:$PATH 将上述命令中的{版本号}替换成安装的Maven版本号,保存并关闭文件。 最后,在终端中输入以下命令,使配置生效: source ~/.zshrc 至此,Maven已经成功安装配置在M1 MacBook上了。可以在终端中输入以下命令来验证: mvn -v 如果显示了Maven的版本号,就说明安装成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最佳第六六六人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值