Maven
大约 6 分钟
What's Maven?
jar & war
jar 包:一个普通 Java 项目打包的成果。
war 包:一个动态 web 项目打包的成功(使用 tomcat 服务器时,将其放在 webapps 中执行发布)。
setting.xml详解
settings.xml
是 Maven 的全局配置文件。一般存在于 ${Maven_HOME}/conf/settings.xml
下面列举了 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">
<!-- 标识构建系统本地仓库的路径 -->
<localRepository>${user.home}/.m2/repository</localRepository>
<!-- 是否需要和用户交互以获得输入 -->
<interactiveMode>true</interactiveMode>
<!-- 是否需要使用 plugin-registry.xml 文件来管理插件版本 -->
<usePluginRegistry>false</usePluginRegistry>
<!-- 是否需要在离线模式下运行 -->
<offline>false</offline>
<!-- 插件的 groupId 没有显式提供时,供搜寻插件的 groupId 列表 -->
<pluginGroups>
<pluginGroup>com.lingyuan.project</pluginGroup>
</pluginGroups>
<!-- 配置服务端的设置 -->
<servers>
<server></server>
</servers>
<!-- 配置下载镜像的列表 -->
<mirrors>
<mirrors>
<!-- 唯一标识符 -->
<id>aliyunmaven</id>
<!-- 被镜像的服务器的 id -->
<mirrorOf>*</mirrorOf>
<!-- 镜像名称 -->
<name>阿里云公共仓库</name>
<!-- 镜像的 URL,构建系统会优先考虑使用该 URL,而非使用默认的服务器 URL -->
<url>https://maven.aliyun.com/repository/public</url>
</mirrors>
</mirrors>
<!-- 配置不同的代理 -->
<proxies>
<proxy></proxy>
</proxies>
<!-- 根据环境参数来调整构建配置的列表 -->
<profiles>
<profile>
<!-- 唯一标识 -->
<id>test</id>
<!-- 触发条件 -->
<activation>
<!-- 默认是否激活 -->
<activeByDefault>false</activeByDefault>
<!-- 匹配的 jdk,模糊匹配所有非 1.8 开头的版本,可以使用 ! 运算符 -->
<jdk>!1.8</jdk>
<!-- 匹配的操作系统 -->
<os>
<!-- 操作系统的名字 -->
<name>Windows 10</name>
<!-- 操作系统所属家族 -->
<family>Windows</family>
<!-- 操作系统体系结构 -->
<arch>x86</arch>
<!-- 操作系统版本 -->
<version>5.1.2600</version>
</os>
<!-- 检测某一个属性,值可以在 POM 中通过 ${name} 引用,按区分大小写方式匹配属性值字段 -->
<property>
<!--属性的名称 -->
<name>mavenVersion</name>
<!--属性的值 -->
<value>2.0.3</value>
</property>
<!-- 检测该文件的存在来激活。missing 检查文件是否存在,如果不存在则激活。exists 则会检查文件是否存在,如果存在则激活 -->
<file>
<exists>${basedir}/file2.properties</exists>
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
<!-- 扩展属性列表 -->
<properties >
<!-- 可以用来存放一些值,这些值可以在 pom.xml 中的任何地方使用标记 ${X} 来使用,这里 X 是指属性的名称 -->
<user.install>${user.home}/our-project</user.install>
</properties>
<!-- 远程仓库列表 -->
<repositories>
<repository></repository>
</repositories>
<!-- 插件仓库列表 -->
<pluginRepositories>
<pluginRepository></pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<!-- 手动激活的列表,对应的 profile 都会被激活 -->
<activeProfiles>
<!-- 要激活的profile id -->
<activeProfile>test</activeProfile>
</activeProfiles>
</settings>
pom文件详解
项目对象模型或 POM 是 Maven 中的基本工作单元。它是一个XML文件,包含有关项目和配置详细信息的信息。当执行任务或目标时,Maven 在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
<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">
<!-- pom 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 项目的组ID,用于 Maven 定位 -->
<groupId>com.lingyuan.project</groupId>
<!-- 项目ID,通常是项目的名称,唯一标识符 -->
<artifactId>project</artifactId>
<!-- 项目的版本 -->
<version>1.0</version>
<!-- 项目的打包方式:pom, jar, maven-plugin, ejb, war, ear, rar, par -->
<packaging>jar</packaging>
<!-- 父项目的位置 -->
<parent>
<!-- 父项目的组 Id -->
<groupId>com.lingyuan</groupId>
<!-- 父项目的 ID -->
<artifactId>project-parent</artifactId>
<!-- 在文件系统的这个位置(relativePath)尝试获取 -->
<relativePath></relativePath>
<!-- 父项目的版本 -->
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 指定当前项目所包含的子模块 -->
<modules>
<module>project-api</module>
<module>project-server</module>
</modules>
<!-- 定义 pom 中的常量 -->
<properties>
<servlet-api-version>2.5</servlet-api-version>
</properties>
<!-- 项目相关依赖配置,父项目的依赖,会被子项目引用 -->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api-version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- 管理依赖的版本,引入依赖时可以无需指定版本,配置写法同 dependencies -->
<dependencyManagement></dependencyManagement>
<!-- 构建配置 -->
<build></build>
<reporting></reporting>
<!-- 项目信息 -->
<name></name>
<description></description>
<url></url>
<inceptionYear></inceptionYear>
<licenses></licenses>
<organization></organization>
<developers></developers>
<contributors></contributors>
<!-- 环境设置 -->
<issueManagement></issueManagement>
<ciManagement></ciManagement>
<mailingLists></mailingLists>
<scm></scm>
<prerequisites></prerequisites>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<distributionManagement></distributionManagement>
<profiles></profiles>
</project>
安装与配置
- Maven 下载,解压缩即可,所在目录不要使用中文以及空格。
- 新建系统变量
M2_HOME
指向Maven 根文件夹
。 - 配置环境变量 path ,添加
%M2_HOME%\bin
。 - 修改 Maven 配置文件
conf/settings.xml
,修改本地仓库位置,<localRepository>自定义的本地仓库地址,如:D:\maven-local-repository</localRepository>
- 修改默认依赖的 JDK 版本
<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>
导入jar包
某些 jar 包在仓库中无法获取到,但又想通过 Maven 引入,可以将本地 jar 包导入 Maven 仓库。
以下是三个将 jar 包导入 Maven 本地仓库的命令:
Mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2 -Dpackaging=jar -Dfile=D:\ojdbc6.jar
Mvn install:install-file -DgroupId=com.danga -DartifactId=memcached -Dversion=2.6.3 -Dpackaging=jar -Dfile=d:\java_memcached-release_2.6.3.jar
Mvn install:install-file -DgroupId=mysql -DartifactId=mysql-connector-java -Dversion=8.0.22 -Dpackaging=jar -Dfile=d:\mysql-connector-java-8.0.22.jar
Mvn install:install-file
:Mvn 安装命令。-DgroupId=
:指定依赖组 ID.-DartifactId=
:指定依赖 ID.-Dversion=
:指定依赖版本。-Dpackaging=
:指定依赖类型。-Dfile=
:指定文件位置。
排除依赖
如果不想使用一个依赖中的某个子依赖,在配置中排除指定的依赖。
<!-- spring-boot-starter 依赖中有许多子依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 排除以下依赖 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖作用域
scope 标签定义依赖范围:
compile
:默认,表示依赖需要参与编译、测试、运行、打包。test
:表示依赖仅参与测试相关的工作。runntime
:表示依赖无需参与编译,但测试、运行需要其参与。provided
:表示依赖不参与打包,可能有其他设施(Web Container)提供,依赖参与编译、测试、运行。在打包阶段做了 exclude 动作。system
:范围与 provided 相同,但依赖项不会从 Maven 仓库获取,而是读取本地系统文件,需要配合systemPath
属性使用。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<!-- 指定作用域 -->
<scope>provided</scope>
</dependency>
相关信息
依赖路径最近原则,配置的依赖越近越优先,如果路径一致,先配置的优先。
扫描配置文件
Maven 默认将配置文件全部放在 resources 文件夹下,在 src 下的配置文件不会被构建。如果需要在构建时加载 src 目录下的配置文件,需要做出以下配置。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>