写点什么

maven 安装与核心概念全面

用户头像
IT视界
关注
发布于: 25 分钟前

一、maven 安装与核心概念

安装

官网下载 Maven (http://maven.apache.org/download.cgi


解压指定目录

配置环境变量

因为 maven 也是 java 开发的,所以一定要确保 JAVA_HOME 配置好

我的电脑-》右键属性-》



点开环境变量-》新建一个系统变量-》名称为 MAVEN_HOME,值为 maven 解压路径


接着在系统变量中找到 path


点开在其中添加 %MAVEN_HOME%\bin


检查是否安装成功(mvn -version)

打开 cmd 窗口,输入 mvn -version


出现版本号就意味着安装成功了

maven 是什么?它的基本功能是什么? 编译打包测试、依赖管理直观感受一下 maven 编译打包的过程。

maven 编译 maven 编译过程

  • 创建 maven 项目

  • 创建 src 文件

  • 编写 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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">   <modelVersion>4.0.0</modelVersion>  //pom文件的编译模型版本<groupId>org.codehaus.mojo</groupId>  //创建项目时的分组ID   <artifactId>my-project</artifactId>   //通常设为项目名   <version>1.0.SNAPSHOT</version>       //通常在后面加一个SNAPSHOT表示快照版本 </project>
复制代码

#mvn 编译命令

mvn compile

---------------------------

[INFO] No sources to compile

[INFO] ---------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ---------------------------------------------------------------

[INFO] Total time: 0.473 s

[INFO] Finished at: 2018-08-05T15:55:44+08:00

[INFO] Final Memory: 6M/153M

[INFO] ---------------------------------------------------------------

请注意,在上述配置和命令当中,我们并没有指定源码文件在哪里?最后编译到哪里去?在这里

maven 采用了约定的方式从指项目结构中获取源码与资源文件进行编译打包。

a. 主源码文件:${project}/src/main/java

b. 主资源文件:${project}/src/main/resources

c. 测试源码文件:${project}/src/test/java

d. 测试资源文件:${project}/src/test/resources

将 java 文件移至 src/main/java 目录,重新执行编译.

mv src/hello.java /src/main/java/hello.java

mvn compile;

maven 打包

#mvn 打包命令

mvn package

maven 依赖管理

  • 在 pom 文件中添加 junit 依赖

  • 修改测试类,加入 junit 代码

  • 执行测试命令

加入依赖配置

<dependencies> <dependency>   <groupId>junit</groupId>   <artifactId>junit</artifactId>   <version>4.0</version>   <scope>test</scope> </dependency> </dependencies> 
复制代码

​修改测试类引入 junit 类.

//引入 junit 类

import org.junit.Assert;

import org.junit.Test;

Assert.assertEquals("","hi");

注意:当我们在 classPath 当中加入 junit ,原来以 test 开头的方法不会被执行,必须加入 @Test 注解才能被执行。

提问:

在刚才的演示过程当中 ,junit jar 包在哪里?是怎么加入到 classPath 当中去的?

maven 是在执行 test 命令的时间 动态从本地仓库中去引入 junit jar 包,如果找不到就会去远程仓库下载,然后在引入。


默认远程仓库:

默认远程仓库 maven central 其配置在

maven-model-builder-3.2.1.jar\org\apache\maven\model\pom-4.0.0.xml 位置

本地仓库位置:

本地仓库位置默认在 ~/.m2/respository 下

要修改 ${M2_HOME}/conf/settings.xml 来指定仓库目录

<localRepository>G:.m2\repository</localRepository>

maven 核心功能总结:

maven 核心作用是编译、测试、打包。

根目录下的 pom.xml 文件设置分组 ID 与 artifactId。

maven 基于约定的方式从项目中获取源码与资源文件进行编译打包。

对于项目所依懒的组件与会本地仓库引用,如果本地仓库不存在则会从中央仓库下载。

二、maven 核心配置

项目依赖

项目依赖是指 maven 通过依赖传播、依赖优先原则、可选依赖、排除依赖、依赖范围等特性来管理项目 ClassPath。

依赖传播特性

我们的项目通常需要依赖第三方组件,而第三方组件又会依赖其他组件,遇到这种情况 maven 会将依赖网络中的所有节点都会加入 ClassPath 当中,这就是 maven 的依赖传播特性

举例演示 SpringMVC 的依赖网络

<dependency>     <groupId>org.springframework</groupId>     <artifactId>spring-webmvc</artifactId>     <version>4.0.4.RELEASE</version> </dependency>
复制代码

在刚刚的演示当中,项目直接依赖了 spring-webmvc 叫直接依赖,而对 commons-logging 依赖是通过 webmvc 传递的所以叫间接依赖。

依赖优先原则

基于依赖传播特性,整个依赖网络会很复杂,难免会出现相同组件不同版本的情况。maven 此时会基于依赖优先原则选择其中一个版本。

第一原则:最短路径优先

第二原则:相同路径下配置在前的优先

第一原则演示:

<!-- 直接添加commons-logging --> <dependency>     <groupId>commons-logging</groupId>     <artifactId>commons-logging</artifactId>     <version>1.2</version> </dependency> 
复制代码

​上述例子中 commons-logging 通过 spring-webmvc 依赖了 1.1.3,而项目中直接依赖了 1.2,基于最短路径原则项目最终引入的是 1.2 版本。

第二原则演示

步骤:

  1. 添加一个新工程 Project B

  2. 配置 Project B 依赖 spring-web.3.2.9.RELEASE

  3. 当前工程直接依赖 Project B

配置完之后,当前工程 project A 有两条路径可以依赖 spring-web,选择哪一条 就取决于 对 webmvc 和 Project B 的配置先后顺序。

Project A==> spring-webmvc.4.0.0.RELEASE ==> spring-web.4.0.0.RELEASE

Project A==> Project B 1.0.SNAPSHOT ==>spring-web.3.2.9.RELEASE

注意:在同一 pom 文件,第二原则不在适应。如下配置,最终引用的是 1.2 版本,而不是配置在前面的 1.1.1 版本.

<!--  在1.2 之前添加 commons-logging --> <dependency>     <groupId>commons-logging</groupId>     <artifactId>commons-logging</artifactId>     <version>1.1.1</version> </dependency> <dependency>     <groupId>commons-logging</groupId>     <artifactId>commons-logging</artifactId>     <version>1.2</version> </dependency>
复制代码

可选依赖

可选依赖表示这个依赖不是必须的。通过在 <dependency> 中添加<optional>true</optional> 表示,

默认是不可选的,可选依赖不会被传递。

排除依赖

即排除指定的间接依赖。通过配置 <exclusions> 配置排除指定组件。

<!-- 排除指定项目 --> <exclusions>     <exclusion>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>     </exclusion> </exclusions>
复制代码

依赖范围

像 junit 这个组件,只有在运行测试用例的时候用到,这就没有必要在打包的时候把 junit.jar 构建进去,可以通过 maven 的依赖范围配置<scope>来达到这种目的,maven 总共支持以下四种依赖范围:

compile(默认):编译范围,编译和打包都会依赖。

provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar

runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar

test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar

system:表示由系统中 ClassPath 指定。编译时依赖,不会打包进去。配合<systemPath>一起使用。示例:java.home 下的 tool.jar

system 除了可以用于引入系统 classpath 中包,也可以用于引入系统非 maven 收录的第三方 Jar,做法是将第三方 Jar 放置在项目的 lib 目录下,然后配置相对路径,但因 system 不会打包进去所以需要配合 maven-dependency-plugin 插件配合使用。当然推荐大家还是通过 将第三方 Jar 手动 install 到仓库。

<!-- system 的通常使用方式--> <dependency>           <groupId>com.sun</groupId>           <artifactId>tools</artifactId>           <version>${java.version}</version>           <scope>system</scope>           <optional>true</optional>           <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency>
复制代码


<!-- system 另外使用方式 ,将工程内的jar直接引入 --> <dependency>     <groupId>jsr</groupId>     <artifactId>jsr</artifactId>     <version>3.5</version>     <scope>system</scope>     <optional>true</optional>     <systemPath>${basedir}/lib/jsr305.jar</systemPath> </dependency>
复制代码

<!-- 通过插件 将system 的jar 打包进去。 --> <plugin>     <groupId>org.apache.maven.plugins</groupId>     <artifactId>maven-dependency-plugin</artifactId>     <version>2.10</version>     <executions>         <execution>             <id>copy-dependencies</id>             <phase>compile</phase>             <goals>                 <goal>copy-dependencies</goal>             </goals>             <configuration>             <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>                 <includeScope>system</includeScope>                 <excludeGroupIds>com.sun</excludeGroupIds>             </configuration>         </execution>     </executions> </plugin>
复制代码

​#手动加入本地仓库

mvn install:install-file -Dfile=abc_client_v1.20.jar -DgroupId=tuling -DartifactId=tuling-client -Dversion=1.20 -Dpackaging=jar

项目聚合与继承

聚合

是指将多个模块整合在一起,统一构建,避免一个一个的构建。聚合需要个父工程,然后使用 <modules> 进行配置其中对应的是子工程的相对路径

<modules>     <module>tuling-client</module>     <module>tuling-server</module> </modules>
复制代码

继承

继承是指子工程直接继承父工程当中的属性、依赖、插件等配置,避免重复配置。

  • 属性继承

  • 依赖继承

  • 插件继承

上面的三个配置子工程都可以进行重写,重写之后以子工程的为准。

依赖管理

通过继承的特性,子工程是可以间接依赖父工程的依赖,但多个子工程依赖有时并不一至,这时就可以在父工程中加入 <dependencyManagement> 声明该功程需要的 jar 包,然后在子工程中引入。

<!-- 父工程中声明 junit 4.12 --> <dependencyManagement>     <dependencies>         <dependency>             <groupId>junit</groupId>             <artifactId>junit</artifactId>             <version>4.12</version>        </dependency>     </dependencies> </dependencyManagement>
复制代码


 <!-- 子工程中引入 --> <dependency>     <groupId>junit</groupId>     <artifactId>junit</artifactId> </dependency>
复制代码


项目属性

通过 <properties> 配置 属性参数,可以简化配置。

<!-- 配置proName属性 --> <properties>     <proName>ddd</proName> </properties> <!-- 引用方式 --> ${proName}
复制代码

maven 默认的属性

${basedir} 项目根目录

${version}表示项目版本;

${project.basedir}同 ${basedir};

${project.version}表示项目版本,与 ${version}相同;

${project.build.directory} 构建目录,缺省为 target

${project.build.sourceEncoding}表示主源码的编码格式;

${project.build.sourceDirectory}表示主源码路径;

${project.build.finalName}表示输出文件名称;

${project.build.outputDirectory} 构建过程输出目录,缺省为 target/classes

项目构建配置

构建资源配置

基本配置示例:

<defaultGoal>package</defaultGoal>

<directory>${basedir}/target2</directory>

<finalName>${artifactId}-${version}</finalName>

说明:

defaultGoal,执行构建时默认的 goal 或 phase,如 jar:jar 或者 package 等

directory,构建的结果所在的路径,默认为 ${basedir}/target 目录

finalName,构建的最终结果的名字,该名字可能在其他 plugin 中被改变


<resources> 配置示例:

<resources>    <resource>       <directory>src/main/java</directory>       <includes>          <include>**/*.MF</include>          <include>**/*.XML</include>       </includes>       <filtering>true</filtering>    </resource>    <resource>       <directory>src/main/resources</directory>       <includes>          <include>**/*</include>          <include>*</include>       </includes>       <filtering>true</filtering>    </resource>   </resources>
复制代码


说明:

resources,build 过程中涉及的资源文件

  • targetPath,资源文件的目标路径

  • directory,资源文件的路径,默认位于 ${basedir}/src/main/resources/目录下

  • includes,一组文件名的匹配模式,被匹配的资源文件将被构建过程处理

  • excludes,一组文件名的匹配模式,被匹配的资源文件将被构建过程忽略。同时被 includes 和 excludes 匹配的资源文件,将被忽略。

  • filtering: 默认 false ,true 表示通过参数对资源文件中的 ${key}在编译时进行动态变更。

发布于: 25 分钟前阅读数: 2
用户头像

IT视界

关注

还未添加个人签名 2021.04.02 加入

致力于帮助所有选择IT行业的人们,希望能通过我的文章使大家少走弯路,踏上坦途

评论

发布
暂无评论
maven安装与核心概念全面