groupid、artifactid、version 构成 maven 坐标,是项目在仓库中的唯一标识;groupid 对应倒写域名(如 com.example),代表组织归属;artifactid 为模块名(如 user-service),影响 jar 文件名;version 推荐语义化(如 1.2.0)或快照版(1.2.0-snapshot)。

什么是 groupId、artifactId、version 这三个必填字段
它们合起来构成 Maven 的“坐标”,是项目在仓库里的唯一身份证。不是随便起的,一旦发布到远程仓库(比如 Maven Central),改名成本极高。
-
groupId通常对应 Java 包名倒写,比如公司域名com.example;它代表组织或项目归属,建议稳定不变 -
artifactId是这个模块自己的名字,比如user-service或common-utils;它和文件系统路径无关,但会影响生成的 JAR 文件名 -
version推荐用语义化版本(如1.2.0),快照版写成1.2.0-SNAPSHOT;Maven 会把-SNAPSHOT版本视为可变的,每次构建都可能拉取新快照
为什么 packaging 默认是 jar 却经常要改成 pom 或 war
这个字段决定项目最终打包成什么类型,也影响 Maven 生命周期执行哪些阶段。选错会导致 mvn package 没输出、或者部署失败。
- 普通 Java 库用
jar(默认值,可省略);Spring Boot 项目虽然也打jar,但实际靠spring-boot-maven-plugin改写行为,不是靠packaging本身 - 多模块父工程必须设为
pom,否则子模块继承会出错;父 POM 里不能有<dependencies></dependencies>,只能用<dependencymanagement></dependencymanagement>统一版本 - 传统 Web 应用要部署到 Tomcat,才需要
war;此时必须确保src/main/webapp目录存在,且web.xml(如有)放在正确位置
parent 标签怎么写才不会让子模块找不到父 POM
父子模块不是靠目录结构自动识别的,而是靠 <parent></parent> 块显式声明。常见错误是只写了 groupId 和 artifactId,漏掉 version 或 relativePath。
- 如果父 POM 在当前目录上一级,写
<relativepath>../pom.xml</relativepath>;默认值是../pom.xml,但一旦父 POM 不在那,就必须显式指定 -
<version></version>必须和父 POM 的<version></version>完全一致,包括-SNAPSHOT;Maven 不会自动解析“最新快照” - IDE(如 IntelliJ)有时缓存旧 parent 信息,改完
pom.xml后记得右键项目 → “Reload project”
依赖范围(scope)选错导致运行时报 NoClassDefFoundError
scope 控制依赖在哪个阶段生效。最常踩的坑是把本该编译+运行时用的库设成 test,或者误用 provided 导致打包后缺类。
立即学习“Java免费学习笔记(深入)”;
-
compile(默认):参与编译、测试、运行;大多数第三方库都走这个 -
test:仅测试编译和运行时有效;比如junit、mockito-core;写在主代码里会编译失败 -
provided:编译期提供,运行时不打包(如servlet-api);如果部署环境没提供该 jar,就会NoClassDefFoundError -
runtime:编译不需要,但运行需要;典型是 JDBC 驱动(mysql-connector-java),接口在 JDK 里,实现类在驱动里
坐标不是命名游戏,是 Maven 查找、下载、解析依赖的底层依据。很多人调不通依赖,不是因为配置写得不够多,而是这三个字段中有一个和实际发布的坐标对不上——尤其是大小写、分隔符、SNAPSHOT 标记这种细节,本地看着一样,仓库里就是两个东西。










