Maven

本文详细介绍了Maven的下载安装、环境配置,包括环境变量、本地仓库和远程仓库设置。讲解了IDEA中配置Maven及创建JavaWeb项目的过程,如配置Tomcat插件、导入依赖等。同时,阐述了Maven仓库的概念,以及plugins、pluginManagement、pom文件scope等关键概念的区别。最后,提供了解决Maven项目创建过慢的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

【maven-3.6.0】
【macOS 10.14】

目录

一、下载、安装

  1. 下载地址:传送门。直接下载:apache-maven-3.6.0-bin.tar.gz
    在这里插入图片描述

  2. 解压,拷贝到 /usr/local路径下

cp 解压包路径 /usr/local

二、配置

2.1 配置环境变量
  1. 配置 环境变量文件
open .bash_profile

添加如下两个变量:MAVEN_HOME是maven解压包的文件路径!!!根据你电脑路径配置。

export MAVEN_HOME=/usr/local/maven-3.6.0
export PATH=$PATH:$MAVEN_HOME/bin
  1. 使环境变量文件.bash_profile生效
source .bash_profile
  1. 查看是否安装成功
mvn -v

如下图,表示配置成功了。
在这里插入图片描述

2.2 配置本地仓库
  1. 打开安装目录下的/conf/settings.xml文件
  2. 配置本地仓库路径

maven本地仓库的默认路径就在 /Users/用户/.m2/repository该目录下。如果需要自定义本地仓库,直接指定自定义路径即可。

  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <localRepository>${user.home}/.m2/repository</localRepository>

2.3 修改Maven远程仓库

我是直接修改的conf/settings.xml,使用的阿里云镜像。

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

查看maven目录:
在这里插入图片描述
bin:存放了 maven 的命令
boot:存放了一些 maven 本身的引导程序,如类加载器等
conf:存放了 maven 的一些配置文件,如 setting.xml 文件
lib:存放了 maven 本身运行所需的一些 jar 包

三、Maven仓库

  • 本地仓库 :用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包, 优先从本地仓库查找
  • 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。 远程仓库可以在互联网内也可以在局域网内。
  • 中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中 央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包 含了世界上大部分流行的开源项目构件。

四、IDEA开发Maven项目

4.1 IDEA配置Maven

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-DarchetypeCatalog=internal

4.2 创建JavaWeb项目

选择Maven ——> 勾选[Create from archetype] ——> 选择webapp模板
在这里插入图片描述
定义公司或组织名、项目名、版本:
在这里插入图片描述
补齐资源目录文件:
创建文件目录:/src/main/java
右键选中java文件——> Mark Directory as ——> Sources Root
在这里插入图片描述
创建MyServlet会报错:缺少jar包。
我们需要先去pom.xml中添加项目运行依赖的jar包,然后配置MyServlet路径。
pom.xml:

<!--放置的都是项目运行所依赖的jar包-->
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <!--作用域:jar包只在写代码时起作用-->
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

web.xml:

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>cn.king.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

然后运行tomcat:
在这里插入图片描述

4.3 导入项目依赖的jar包

比如,创建Servlet实例,如何导入Servlet所需要的jar包:
pom.xml,引用项目运行所依赖的jar包

<!--放置的都是项目运行所依赖的jar包-->
<dependencies>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>
4.4 获取jar包坐标

阿里云仓库:传送门
Maven中央仓库:传送门

IDEA中需要引用的包,本地仓库没有。下面以Maven中央仓库为例,下载包到本地仓库:
搜索需要的jar包:
在这里插入图片描述
选中需要的jar包,点击进入详情页:
在这里插入图片描述
选择需要的jar包版本,点击进入下一页:
在这里插入图片描述
拷贝如图中红色方框中的内容,粘贴到IDEA中的pom.xml中:
在这里插入图片描述

<dependencies>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

选中IDEA中的pom.xml文件,右键——>Maven——>Reimport
在这里插入图片描述

4.5 指定web资源包

例如,java文件,无法new资源文件,例如js index页面等。如何解决?
在这里插入图片描述
File ——> Project Structure
在这里插入图片描述
把需要创建资源文件的文件路径添加到 Web Resource Directories 中!
在这里插入图片描述

4.6 配置tomcat插件

<build>节点,添加tomcat插件。
注意:这个坐标一定不能放在<pluginManagement>里面,如果放在里面,插件是不能下载的,只是被管理.

pom.xml,修改端口号为8888:
如果本地仓库没有tomcat插件,那么就参考 4.3 下载中央仓库的jar包到本地仓库 最后一步,下载。

 <plugins>
   <plugin>
     <groupId>org.apache.tomcat.maven</groupId>
     <artifactId>tomcat7-maven-plugin</artifactId>
     <version>2.2</version>
     <configuration>
       <port>8888</port> <!-- 访问端口-->
       <path>/</path>    <!-- 访问路径-->
     </configuration>
   </plugin>
 </plugins>

然后,使用tomcat7运行JavaWeb项目:
在这里插入图片描述
此处我们就可以看到 4.1 创建JavaWeb项目 中我已经启动了服务器(端口号8080),再次使用tomcat7启动了一次,两个服务器均被启动。

4.7 使用idea创建maven工程参数配置

原因:IDEA根据maven archetype的本质,其实是执行mvn archetype:generate命令,该命令执行时,需要指定一
个archetype-catalog.xml文件。该命令的参数-DarchetypeCatalog,可选值为:remote,internal ,local等,
用来指定archetype-catalog.xml文件从哪里获取。默认为remote,即从
http://repo1.maven.org/maven2/archetype-catalog.xml路径下载archetype-catalog.xml文件。
http://repo1.maven.org/maven2/archetype-catalog.xml 文件约为3-4M,下载速度很慢,导致创建过程卡住。

-DarchetypeCatalog=internal

五、常见的一些概念

5.1 plugins和pluginManagement的区别

如下,pom文件中的两种写法:
写法一:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${maven.compile.source}</source>
                <target>${maven.compile.target}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

写法二:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${maven.compile.source}</source>
                    <target>${maven.compile.target}</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
标签功能
pluginManagement表示插件声明,声明的插件不会被Maven加载,并且该插件可以被子pom继承。该标签一般是用来在父pom中定义,提供给子POM使用,子pom也可以覆盖这个定义,而且在父pom中定义了版本之后,子模块中直接应用groupId和artifactId,而不用指定该插件版本,方便统一管理插件,确保所有子pom插件版本一致;并且在父pom中声明的插件,不会介入到Maven的生命周期。
plugins直接引入一个plugin,而且可以绑定到Maven相关的生命周期上。
5.2 pom文件scope的取值

示例:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

介绍:

scope取值功能
compile默认的scope。任何定义在compile scope下的依赖将会在所有的class paths下可用。maven工程会将其打包到最终的artifact中。如果你构建一个WAR类型的artifact,那么在compile scope下引用的JAR文件将会被集成到WAR文件内。
provided这个scope假定对应的依赖会由运行这个应用的JDK或者容器来提供。最好的例子就是servlet API。任何在provided scope下定义的依赖在构建时的类路径里是可用的,但是不会被打包到最终的artifact中。如果是一个WAR的文件,servlet API在构建时的类路径里是可用的,但是并不会被打包到WAR文件中。
runtime在runtime scope下定义的依赖只会在运行期可用,而在构建期的类路径下不可用。这些依赖将会被打包到最终的artifact中。比如你有一个基于web的应用需要在运行时访问MySQL数据库。你的代码没有任何MySQL数据库驱动的硬依赖。你的代码仅仅是基于JDBC API来编写,在构建期并不需要MySQL数据库驱动。然而,在运行期,就需要相应的驱动来操作MySQL数据库了。因此,这个驱动应该被打包到最终的artifact中。
test只用于测试变异的依赖(比如JUnit),execution必须定义在test scope下。这些依赖不会被打包到最终的artifact中。
system于provided scope很像。唯一的区别在于,在system scope中,你需要告诉Maven如何去找到这个依赖。如果你要引用的依赖在Maven仓库中不存在时,就可以用这个scope。不推荐使用system依赖。
import从其它的pom文件中导入依赖设置。
5.3 dependencyManagement与dependencies区别

① dependencyManagement应用场景
为了项目的正确运行,必须让所有的子模块使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。在我们项目顶层的pom文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

②dependencies应用场景
相对于dependencyManagement,如果在父工程pom中通过dependencies引入jar,将默认被所有的子模块继承。

③dependencyManagement与dependencies区别
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。

六、常见的问题及解决方案

6.1 解决Maven项目创建过慢

创建项目时,添加键值对archetypeCataloginternal
项目创建最后一个页面
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值