【Java从0到架构师】Maven
Maven
- Tomcat 部署项目的方式
- 传统项目 vs Maven 项目
- Maven
- Maven 项目的常见目录
- pom.xml
- 构建生命周期
- default 生命周期
- 常用命令
- dependency 中 scope 的取值
- Maven 常见操作
- 初始化配置:环境变量、仓库位置、配置镜像
- 修改 Maven 的 JDK 版本
- 命令行新建 Maven 项目
- IDEA 导入 Maven 项目
- IDEA 新建 Maven 项目(Web 项目)
- 生成 Runnable Jar
- 安装本地 jar 到 Maven 的 LocalRepository
- Maven 常见问题解决
- 文件编码的警告:Using platform encoding
- 控制台输出乱码
Java 从 0 到架构师目录:【Java从0到架构师】学习记录
Tomcat 部署项目的方式
Tomcat 部署项目的方式有 4 种:
- 将 web 项目整个文件夹,放在
%TOMCAT_HOME%/webapps
目录中,文件夹名作为 ContextPath - 将 web 项目打包成 war,放在
%TOMCAT_HOME%/webapps
目录中,war 文件名作为 ContextPath - 在
%TOMCAT-HOME%/conf/server.xml
的 Host 标签中添加以下内容(ContextPath 是 path 属性值)
<Context docBase="项目路径" path="/xxx" />
- 在
%TOMCAT_HOME%/conf/Catalina/localhost
中新建一个 xml 文件,xml 文件名作为 ContextPath
<Context docBase="项目路径"/>
传统项目 vs Maven 项目
传统开发中的常见痛点:
- jar 包的下载、升级、依赖、冲突
- 不同 IDE 之间的项目共享
- 单元测试
- 打包发布
传统项目 vs Maven 项目:
Maven
Apache Maven,主要用于自动化构建和管理 Java 项目
- 基于 项目对象模型(POM,Project Object Model ) 的概念
- 下载地址:https://maven.apache.org/download.cgi
必须配置好 JAVA_HOME,Maven 对 JDK 版本的要求:https://maven.apache.org/docs/history.html
添加 MAVEN_HOME\bin 到 PATH 中:
Maven 仓库查询:
- https://search.maven.org/
- https://mvnrepository.com/
Maven 项目的常见目录
Maven 使用 “约定优于配置” 的思想 (Convention over Configuration)
- 创建 Maven 项目时,Maven 将创建默认项目结构,开发人员只需要相应地放置文件
pom.xml
pom.xml 是 Maven 项目的核心配置文件,根元素是 project。project 的常用子元素如下表所示:
groupId、artifactId、version 组成一个 Maven坐标 (Coordinate),能够唯一的确定一个项目
构建生命周期
构建生命周期,描述了构建的过程。Maven 内置了 3 个构建生命周期:
- clean(清理)
- default(默认,重点关注)
- site(站点)
构建生命周期由 phase(阶段)组成
- phase 可以跟 plugin goal(插件目标)绑定
- plugin goal 代表 1 个特定的任务
- 一旦某个 phase 被执行,就会执行其绑定的所有 goal
通过命令 mvn 插件:help
可以查看插件包含的所有 goal
- 比如
mvn archetype:help
default 生命周期
default 生命周期由下表中的 phase 组成:
使用命令 mvn package
就会按顺序执行 validate、compile、test、package 这几个阶段
常用命令
mvn archetype:generate
:创建 Maven 项目
mvn clean
:清楚 target
mvn clean package
:先执行 clean,再执行 package
dependency 中 scope 的取值
compile:默认。编译依赖关系在所有类路径中均可用。此外,这些依赖项会传递到相关项目
provided:仅在编译和测试类路径上可用,并且不可传递。希望JDK或容器在运行时提供它
runtime:依赖关系不是编译所必需,而是运行所必需的。它在运行时和测试类路径中,但不在编译类路径中
test:依赖关系对于正常使用该应用程序不是必需的,并且仅在测试编译和执行阶段可用。它不是可传递的
system:必须显式提供 jar 的位置(可以通过 systemPath
标签指定),不会去 Maven 仓库中查找
Maven 常见操作
初始化配置:环境变量、仓库位置、配置镜像
先配置 JAVA_HOME,然后配置 MAVEN_HOME,添加 %MAVEN_HOME%/bin 到 PATH 中
修改仓库位置:在 %MAVEN_HOME%/conf/settings.xml 的 <settings> 标签中添加1个 <localRepository>
<localRepository>F:\Dev\Java\.m2\repository</localRepository>
提高仓库的下载速度:在 %MAVEN_HOME%/conf/settings.xml 的 <mirrors> 标签中添加1个 <mirror>
<mirror><id>aliyun</id><name>aliyun</name><url>https://maven.aliyun.com/repository/public</url><mirrorOf>central</mirrorOf>
</mirror>
修改 Maven 的 JDK 版本
方法 1:在 pom.xml 中添加属性(每个 Maven 项目都要添加)
<properties><maven.compiler.source>14</maven.compiler.source><maven.compiler.target>14</maven.compiler.target><maven.compiler.compilerVersion>14</maven.compiler.compilerVersion>
</properties>
方法 2:在 pom.xml 中添加插件(每个 Maven 项目都要添加)
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>14</source><target>14</target></configuration>
</plugin>
方法 3:在 %MAVEN_HOME%/conf/settings.xml 的 <profiles> 标签中添加 1 个 <profile>
这是一种一劳永逸的办法,不需要去修改每一个 Maven 项目的 pom.xml,但其他人可能无法运行该项目
<profile><id>jdk14</id><activation><activeByDefault>true</activeByDefault><jdk>14</jdk></activation><properties><maven.compiler.source>14</maven.compiler.source><maven.compiler.target>14</maven.compiler.target><maven.compiler.compilerVersion>14</maven.compiler.compilerVersion></properties>
</profile>
命令行新建 Maven 项目
方法 1:
- 在命令行输入:
mvn archetype:generate
,会让我们选择项目类型 - 默认值是 7, maven-archetype-quickstart,是一个普通的 Java 项目
- 如果希望创建一个 web 项目,输入 10, maven-archetype-webapp
输入 groupId、artifactId、version、package
如果希望 version、package 使用默认值,直接敲回车即可
最后输入 y 表示确认,项目就创建完毕了
方法 2:用命令行配置好创建项目的各种参数
mvn archetype:generate -DgroupId=com.mj.maven -DartifactId=helloworld -Dversion=1.0-RELEASE -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart
IDEA 导入 Maven 项目
选择 pom.xml 进行导入
IDEA 新建 Maven 项目(Web 项目)
生成 Runnable Jar
方法 1:maven-jar-plugin
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib</classpathPrefix><mainClass>主类</mainClass></manifest></archive><finalName>jar的文件名</finalName></configuration>
</plugin>
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>3.1.2</version><executions><execution><!-- <phase>package</phase> --><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions>
</plugin>
方法 2:maven-assembly-plugin
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><archive><manifest><mainClass>主类</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><finalName>jar的文件名</finalName><appendAssemblyId>false</appendAssemblyId></configuration><executions><execution><phase>package</phase><goals><goal>single</goal></goals></execution></executions>
</plugin>
方法 3:maven-shade-plugin
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.3</version><executions><execution><!-- <phase>package</phase> --><goals><goal>shade</goal></goals><configuration><shadedArtifactAttached>true</shadedArtifactAttached><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>主类</mainClass></transformer></transformers><finalName>jar的文件名</finalName></configuration></execution></executions>
</plugin>
方法 4:spring-boot-maven-plugin
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.0.RELEASE</version><executions><execution><!-- <phase>package</phase> --><goals><goal>repackage</goal></goals><configuration><mainClass>主类</mainClass><finalName>jar的文件名</finalName></configuration></execution></executions>
</plugin>
安装本地 jar 到 Maven 的 LocalRepository
这个操作是为了解决 Maven 中央仓库没有某些需要的 Jar 包的情况
mvn install:install-file -Dfile=jar的路径 -DgroupId=组织 -DartifactId=库名 -Dversion=版本 -Dpackaging=jar
Maven 常见问题解决
文件编码的警告:Using platform encoding
如果通过 Idea 部署的 Tomcat 打包不会出现问题,通过 Maven 打包会出现问题
解决方案:在 pom.xml 中添加项目编码
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
控制台输出乱码
解决方案:
Settings -> Build, Execution, Deployment -> Build Tools -> Maven -> Runner
在 VM Options 中添加 -Dfile.encoding=GBK
【Java从0到架构师】Maven相关推荐
- 【Java从0到架构师】Maven - 依赖冲突、分模块构建项目
SpringBoot - Maven 补充 依赖冲突 解决方案 - dependencyManagement 自定义属性 分模块构建项目 继承 - parent 聚合 - modules 依赖 - d ...
- 【Java从0到架构师(1),Java中高级面试题总结(全面)
JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...
- 【Java从0到架构师】SpringCloud - Eureka、Ribbon、Feign
SpringCloud 分布式.微服务相关概念 微服务框架构选型 SpringCloud 概述 服务注册与发现 - Eureka 案例项目 Eureka 自我保护机制 微服务调用方式 - Ribbon ...
- 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装
RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...
- 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...
- 【Java从0到架构师】Redis 进阶 - pipline、发布订阅、Bitmap、HyperLogLog、GEO
Redis 原理与实战 Jedis 的基本使用 Redis 数据淘汰策略 Redis 进阶拓展 pipline - 命令批处理,减少大量命令的网络开销,提高操作性能 发布订阅 - subscribe ...
- 【Java从0到架构师】SpringBoot - 入门_配置文件_YAML
SpringBoot - 入门_配置文件_YAML SpringBoot - 入门 @SpringBootApplication 可运行 jar - spring-boot-maven-plugin ...
- 【Java从0到架构师】SSM 整合(XML、纯注解)
SSM 整合 父子容器 父子容器的配置文件建议 子容器的加载创建 父容器的加载创建 MyBatis 补充 mybatis-config.xml Maven 补充 SSM 整合 - 纯注解 Initia ...
- 【Java从0到架构师】SpringMVC - 返回值
SpringMVC - 返回值 controller 中的返回值 无返回值 - 使用原始的 Servlet 的方法 普通文本.HTML - 设置响应头 Content-Type XML - 推荐使用 ...
最新文章
- centos7快速搭建LAMP
- spring web参数传递
- 他山之石可以攻玉, 不可不读的阿里云原生中间件行业案例与实践集锦
- 第17讲:aiohttp 异步爬虫实战
- 计算机硬件系统都是看得见的,计算机组成硬件系统).doc
- android jni framework,Android Framework层的JNI机制(二)
- 用tensorflow实现最简单的神经网络
- 刚才看到一篇文章,感觉不错,转载过来和大家分享:
- 中学图书室管理用计算机,中学“学生电子阅览室管理制度”
- Hadoop AWS Word Count 样例
- 基于PHP的在线聊天室(网页版)
- Electron 打包时下载 xxx-electron-v1.6.8-arch-x64.zip 文件出错
- android 音量流类型,android 音量控制setVolumeControlStream
- Nature:分离到一种位于原核生物-真核生物“交界”的古菌
- STM32+QRCode二维码生成
- QQ互联登录- 前端为 vue.js
- Excel长串数字显示异常,如2E+13
- noip模拟赛 终末
- 微型计算机汇编语言与接口技术课后答案,微机原理、汇编语言及接口技术教程课后习题答案...
- 复旦大学和吉大计算机考研选哪个,复旦综合实力强,但这个学科比不上吉大,考生该怎么报考...
热门文章
- 多目标跟踪全解析,全网最全
- anaconda安装pytorch1.7.1和torchvision0.8.2的方法,亲测可用
- ssrs行高_SSRS中的备用行颜色
- 了解SQL Server CASE语句
- sql server复制表_具有超过246列的表SQL Server复制
- sql还原数据库备份数据库_有关数据库备份,还原和恢复SQL面试问题–第二部分
- azure云数据库_使用Azure Active Directory和Azure SQL数据库
- 201671010430 司昕劼 实验十四 课程学习总结
- python—004
- innerHTML和outerHTML的区别