③Maven创建Maven工程,解读核心配置。
Posted .29.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了③Maven创建Maven工程,解读核心配置。相关的知识,希望对你有一定的参考价值。
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~
创建Maven工程,解读核心配置。
一、创建Maven工程
- 生成Maven工程的命令行
mvn archetype:generate
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7:(默认选择7,直接回车即可)
Define value for property ‘groupId’:(填groupID,例:com.haojin.maven)
Define value for property ‘artifactId’:(填artifactID,例:pro01-maven-java)
Define value for property ‘version’ 1.0-SNAPSHOT: :(不需要修改就回车)
Define value for property ‘package’ com.haojin.maven: :(不需要修改就回车)
groupId: com.haojin.maven
artifactId: pro01-maven-java
version: 1.0-SNAPSHOT
package: com.haojin.maven
Y: : (检查没问题,直接回车;需要修改,则输入 N 再回车。)
构建成功
二、解读核心配置
pom.xml
是Maven工程的核心配置文件
- 对Maven工程的核心配置文件进行解读:
<!-- project标签:根标签,表示对当前工程进行配置,管理 -->
<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标签:从Maven2开始就固定为 4.0.0 -->
<!-- 代表当前 pom.xml 所采用的标签结构 -->
<modelVersion>4.0.0</modelVersion>
<!-- 坐标信息 -->
<!-- groupId标签:坐标向量之一:代表公司或组织开发的某一个项目 -->
<groupId>com.haojin.maven</groupId>
<!-- artifactId标签:坐标向量之一:代表项目下的某一个模块 -->
<artifactId>pro01-maven-java</artifactId>
<!-- version标签:坐标向量之一:代表当前模块的版本 -->
<version>1.0-SNAPSHOT</version>
<!-- packaging标签:表示当前Maven工程的打包方式 -->
<!-- jar:表示这个工程是一个Java工程 -->
<!-- war:表示这个工程是一个Web工程 -->
<!-- pom:表示这个工程是“管理其他工程”的工程 -->
<packaging>jar</packaging>
<name>pro01-maven-java</name>
<url>http://maven.apache.org</url>
<!-- properties标签:在Maven中定义属性值 -->
<properties>
<!-- 工程构建过程中读取源码时使用的字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- dependencies标签:配置当前工程所依赖的jar包 -->
<dependencies>
<!-- dependency标签:配置一个具体的依赖 -->
<dependency>
<!-- 坐标信息:使用具体的坐标依赖我们需要的一个jar包 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- scope标签:配置当前依赖的范围 -->
<scope>test</scope>
</dependency>
</dependencies>
</project>
——————————
- 配置文件中做出的修改
新创建的工程默认版本过低,找到dependencies
标签中的version
标签,版本改为4.12
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
VIP课程:互联网工程专题 03-Maven基本概念与核心配置
概要:
- maven 基本概念
- maven 核心配置
一、maven 安装与核心概念
概要:
- maven 安装
- maven 编译(compile)
- 执行测试用例(test)
- maven 打包
- maven 依懒管理
1、安装
- 官网下载 Maven (https://maven.apache.org/)
- 解压指定目录
- 配置环境变量
- 检查安装是否成功 (mvn -version)
2、maven 编译
maven 编译过程演示
l 创建maven项目。
l 创建src 文件
l 编写 pom 文件
l 执行编译命令
请注意,在上述配置和命令当中,我们并没有指定源码文件在哪里?最后编译到哪里去?在这里
maven 采用了约定的方式从指项目结构中获取源码与资源文件进行编译打包。
- 主源码文件:${project}/src/main/java
- 主资源文件:${project}/src/main/resources
- 测试源码文件:${project}/src/test/java
- 测试资源文件:${project}/src/test/resources
3、Maven打包
maven 打包演示
#mvn 打包命令
mvn package
4、maven 单元测试演示
l 编写测试类
l 执行测试命令
执行完指令发现没有执行我们的测试方法,这是为何?原因在于maven 当中的测试类又做了约定,约定必须是Test开头的类名与test 开头的方法才会执行。
重新修改方法名后 在执行mvn test 即可正常执行。
通常测试我们是通过junit 来编译测试用例,这时就就需添加junit 的依赖。
5、maven 依赖管理
l 在pom 文件中添加junit 依赖
l 修改测试类,加入junit 代码
l 执行测试命令
提问:
在刚才的演示过程当中 ,junit jar包在哪里?是怎么加入到classPath 当中去的?maven 是在执行test 命令的时间 动态从本地仓库中去引入junit jar 包,如果找不到就会去远程仓库下载,然后在引入。
本地仓库位置:
本地仓库位置默认在 ~/.m2/respository 下
要修改 ${M2_HOME}/conf/settings.xml 来指定仓库目录
<!-- 指定本地仓库目录-->
<localRepository>G:\\.m2\\repository</localRepository>
二、maven核心配置
概要:
- 项目依懒(内部、外部)
- 项目聚合与继承
- 项目构建配置
项目依懒
项目依赖是指maven 通过依赖传播、依赖优先原则、可选依赖、排除依赖、依赖范围等特性来管理项目ClassPath。
1、依赖传播特性:
我们的项目通常需要依赖第三方组件,而第三方组件又会依赖其它组件遇到这种情况Maven会将依赖网络中的所有节点都会加入ClassPath当中,这就是Maven的依赖传播特性。
举例演示Spring MVC的依赖网络
<!-- 添加spring web mvc演示 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.10.RELEASE</version>
</dependency>
在刚刚的演示当中,项目直接依赖了spring-webmvc 叫直接依赖,而对commons-logging 依赖是通过webmvc传递的所以叫间接依赖。
2、依赖优先原则
基于依赖传播特性,导致整个依赖网络会很复杂,难免会出现相同组件不同版本的情况。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 版本。
第二原则演示:
步骤:
- 添加一个新工程Project B
- 配置Project B 依赖 spring-web.3.2.9.RELEASE
- 当前工程直接依赖 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版本。
3、可选依赖
可选依赖表示这个依赖不是必须的。通过在 <dependency>
添加 <optional>true</optional> 表示,默认是不可选的。可选依赖不会被传递。
l 演示可选依赖的效果。
4、排除依赖
即排除指定的间接依赖。通过配置 <exclusions> 配置排除指定组件。
<!-- 排除指定项目 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
l 演示排除依赖
5、依赖范围
像junit 这个组件 我们只有在运行测试用例的时候去要用到,这就没有必要在打包的时候把junit.jar 包过构建进去,可以通过Mave 的依赖范围配置<scope>来达到这种目的。maven 总共支持以下四种依赖范围:
compile(默认): 编译范围,编译和打包都会依赖。
provided:提供范围,编译时依赖,但不会打包进去。如:servlet-api.jar
runtime:运行时范围,打包时依赖,编译不会。如:mysql-connector-java.jar
test:测试范围,编译运行测试用例依赖,不会打包进去。如:junit.jar
推荐大家还是通过 将第三方Jar手动install 到仓库。
#手动加入本地仓库 mvn install:install-file -Dfile=abc_client_v1.20.jar -DgroupId=tuling -DartifactId=tuling-client -Dversion=1.20 -Dpackaging=jar
system 除了可以用于引入系统classpath 中包,也可以用于引入系统非maven 收录的第三方Jar,做法是将第三方Jar放置在 项目的 lib 目录下,然后配置 相对路径,但因system 不会打包进去所以需要配合 maven-dependency-plugin 插件配合使用。
<!-- 通过插件 将system 的第三方jar 打包进去。 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.1</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>
项目聚合与继承
1、聚合
是指将多个模块整合在一起,统一构建,避免一个一个的构建。聚合需要个父工程,然后使用 <modules> 进行配置其中对应的是子工程的相对路径
<modules>
<module>tuling-client</module>
<module>tuling-server</module>
</modules>
2、继承
继承是指子工程直接继承父工程 当中的属性、依赖、插件等配置,避免重复配置。
- 属性继承:
- 依赖继承:
- 插件继承:
上面的三个配置子工程都可以进行重写,重写之后以子工程的为准。
3、依赖管理
通过继承的特性,子工程是可以间接依赖父工程的依赖,但多个子工程依赖有时并不一至,这时就可以在父工程中加入 <dependencyManagement> 声明该功程需要的JAR包,然后在子工程中引入。
4、项目属性:
通过 <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
项目构建配置
- 构建资源配置
- 编译插件
- profile 指定编译环境
构建资源配置
基本配置示例:
<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} 在编译时进行动态变更。替换源可紧跟 -Dkey 和pom 中的<properties> 值 或 <filters> 中指定的properties 文件。
以上是关于③Maven创建Maven工程,解读核心配置。的主要内容,如果未能解决你的问题,请参考以下文章
什么是maven与maven的使用过程(例如在idea创建maven工程(重点讲讲idea创建使用maven管理的web工程,并且部署到tomcat上))
VIP课程:互联网工程专题 03-Maven基本概念与核心配置
Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ③ ( 配置上传工件 | 将 Gradle 插件 jar 包源码文档上传到本地Maven 仓库 )