环境
【maven-3.6.0】
【macOS 10.14】
目录
一、下载、安装
-
下载地址:传送门。直接下载:apache-maven-3.6.0-bin.tar.gz
-
解压,拷贝到
/usr/local
路径下
cp 解压包路径 /usr/local
二、配置
2.1 配置环境变量
- 配置 环境变量文件
open .bash_profile
添加如下两个变量:MAVEN_HOME
是maven解压包的文件路径!!!根据你电脑路径配置。
export MAVEN_HOME=/usr/local/maven-3.6.0
export PATH=$PATH:$MAVEN_HOME/bin
- 使环境变量文件.bash_profile生效
source .bash_profile
- 查看是否安装成功
mvn -v
如下图,表示配置成功了。
2.2 配置本地仓库
- 打开安装目录下的
/conf/settings.xml
文件 - 配置本地仓库路径
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包坐标
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项目创建过慢
创建项目时,添加键值对archetypeCatalog
、internal
项目创建最后一个页面