服务端2月18日 20:48
什么是 Maven?它解决了 Java 项目构建里的哪些问题?Maven 是 Java 生态里最常用的项目构建和依赖管理工具之一。它用一个 `pom.xml` 描述项目坐标、依赖、插件和构建流程,然后按约定完成编译、测试、打包、安装和发布。以前手工下载 jar、手写编译脚本、每个项目目录结构都不一样,Maven 解决的正是这些重复又容易出错的问题。
Maven 的核心概念有四个:POM、坐标、仓库和生命周期。POM 是项目对象模型,坐标由 `groupId`、`artifactId`、`version` 标识一个构件。仓库分本地仓库和远程仓库,依赖会先查本地,找不到再从远程下载。生命周期则规定构建顺序,插件负责在具体阶段执行真正的任务。
```...服务端2月18日 20:48
Maven scope 有哪些类型?什么时候该用 compile、provided 或 runtime?Maven 的 scope 决定一个依赖在哪些阶段可见:编译、测试、运行、打包,以及是否会传递给下游项目。它不是简单的分类标签,而是在控制 classpath 边界。scope 配错时,轻则最终包变大,重则本地能跑、服务器启动就报类找不到。
最常见的是 `compile`,它是默认范围,编译、测试、运行都可用,也会传递。`provided` 表示编译和测试需要,但运行时由 JDK、容器或平台提供。`runtime` 表示编译时不需要,运行和测试时需要。`test` 只在测试代码中可见,不会进入正式产物。`system` 需要指定本地 jar 路径,几乎不推荐。`import` 只能用于...服务端2月18日 20:48
Maven 依赖传递如何工作?冲突版本该怎么排查?Maven 依赖传递的意思是:你的项目依赖 A,而 A 又依赖 B,那么 B 通常会自动进入你的项目 classpath。这个机制省掉了大量手工拷 jar 的工作,但也会带来版本冲突、重复依赖和运行时类不兼容。排查 Maven 依赖问题时,不要先猜哪个 jar 错了,先看依赖树。
Maven 决定冲突版本时主要看两个规则:路径近的优先,路径一样近时先声明的优先。比如项目同时通过两条路径引入 `guava:30` 和 `guava:32`,Maven 只会选一个版本进入最终依赖。这个选择不一定符合业务预期,所以大型项目通常会用父 POM 或 BOM 统一锁版本。
```bash
mvn...服务端2月18日 20:48
Maven 生命周期有哪些阶段?执行命令时到底跑了什么?Maven 生命周期可以理解为一条已经排好顺序的构建流水线。你输入的不是“执行某个脚本”,而是告诉 Maven 要跑到哪个阶段,Maven 会把这个阶段之前的阶段一起执行。最常用的是 default 生命周期,另外还有 clean 生命周期和 site 生命周期,它们彼此独立。
clean 生命周期负责清理构建产物,典型命令是 `mvn clean`,会删除 `target` 目录。default 生命周期负责从校验、编译、测试到打包、安装、发布的主流程。site 生命周期负责生成项目站点文档,业务项目里用得少,但开源库发布文档时仍然有价值。
default 生命周期里高频阶段包括 ...服务端2月18日 20:49
Maven 多模块项目如何管理?聚合和继承该怎么取舍?Maven 多模块项目通常要同时解决两件事:一次构建多个模块,以及让多个模块共享同一套版本、插件和属性配置。聚合解决的是“构建顺序和构建入口”,继承解决的是“公共配置从哪里来”。两者经常放在同一个父 POM 里,但它们不是一回事,也不是必须绑定使用。
一个典型结构会把根目录作为 parent,打包类型设为 `pom`,再通过 `<modules>` 声明子模块。执行根目录的 `mvn clean install` 时,Maven 会读取各模块之间的依赖关系,按 reactor 顺序编译,而不是简单按目录顺序跑。
```xml
<project>
<modelVersion>4.0...服务端2月18日 20:49
Maven 仓库和镜像该怎么配置才不会拉错依赖?Maven 仓库看似只是下载依赖的地方,实际会影响构建速度、依赖安全和产物可追溯性。一个项目通常会同时接触本地仓库、中央仓库、公司私服和镜像;配置不当时,最常见的问题不是“下载不到”,而是下载到了不该用的版本。理解仓库配置时要分清三个概念:repository 是依赖来源,mirror 是替代某个来源的镜像,server 是认证信息。三者 id 对不上,Maven 不会好心提醒你设计错了,只会在构建时用各种 401、404 或 checksum 错误折磨你。
## Maven 会按什么顺序找依赖?
Maven 先查本地仓库,默认在 `~/.m2/repository`。本地没有时,再...服务端2月18日 20:49
Maven 插件是怎样绑定生命周期并执行构建任务的?Maven 真正干活的是插件。`mvn package` 看起来只是一条生命周期命令,背后会按阶段触发一串插件目标,比如编译、复制资源、运行测试、打包。理解插件时不要只背“plugin、goal、phase”三个词,关键是看它什么时候执行、执行几次、配置从哪里来。很多构建问题并不是 Maven 神秘,而是某个插件目标绑定错阶段,或者父 POM 里的默认配置被子模块悄悄继承了。
## 插件、目标和生命周期是什么关系?
插件是一组能力,目标是插件里的一个具体动作,生命周期阶段只是 Maven 预设的一条时间线。比如 `maven-compiler-plugin` 提供 `compile`...服务端2月18日 20:49
Maven Profile 如何管理多环境配置才不容易出错?Maven Profile 适合解决“同一套项目,在不同构建场景下需要少量差异配置”的问题,比如 dev、test、prod 使用不同资源过滤值,或者 CI 构建时额外打开跳过集成测试的开关。它不适合承载所有运行时配置,更不应该把数据库密码、生产密钥直接写进 `pom.xml`。判断边界很简单:影响构建产物、依赖、插件行为的配置可以放 Profile;应用启动后才读取的配置,优先交给配置中心、环境变量或部署平台。
## Profile 放在哪里更合适?
项目级 Profile 通常写在 `pom.xml`,便于团队共享,适合资源过滤、插件参数、可选依赖这类和项目强相关的内容。用户级 ...服务端2月18日 20:50
Maven 和 Gradle 有什么区别?项目该怎么选?Maven 和 Gradle 都能完成 Java 项目的依赖管理、编译、测试和打包,但它们解决问题的方式不一样。Maven 更像一套稳定的约定:目录怎么放、生命周期怎么走、插件怎么绑定,都有明确规则。Gradle 更像可编程的构建平台:你可以用 Groovy 或 Kotlin DSL 写任务、组合逻辑、做缓存和增量构建。选择哪一个,不是看谁更“先进”,而是看项目需要稳定约定,还是需要更强的构建表达能力。
## 配置方式有什么差别?
Maven 使用 XML 写 `pom.xml`,结构清晰,但配置稍显冗长。Gradle 使用 `build.gradle` 或 `build.gradl...服务端2月18日 20:50
Maven 常用命令怎么用?哪些参数能提高构建效率?Maven 命令看起来很多,其实大部分都围绕三件事:按生命周期构建项目、查看依赖问题、控制构建范围。日常开发不需要背完整手册,但要知道每个命令会跑到哪个阶段、会不会执行测试、会不会把产物写进本地仓库或远程仓库。命令用错,轻则构建慢,重则把不该发布的版本推到仓库。
## 生命周期命令怎么选?
最常用的是 `clean`、`compile`、`test`、`package`、`install` 和 `deploy`。Maven 会从生命周期起点一直执行到你指定的阶段,所以 `mvn package` 不只是打包,它会先编译并运行测试;`mvn install` 会在打包后把产物安装到本地...