Loading...

一篇搞懂:Java包名、Maven artifactId、Spring application.name到底有啥区别?

项目文件夹叫codeedge-backend,Java包名是codeedgebackend,Maven的artifactIdcodeedge-backend,Spring配置里还有个spring.application.namecodeedge-backend

这几个到底有啥区别?必须要对上吗?

其实,这几个是完全不同维度、不同作用、没有任何强制绑定关系的配置,给谁用、管什么、能不能乱改,差别还是挺大的。

我就用 codeedge-backend 项目当例子,先从最核心、最容易踩语法坑的 Java 包名说起。

Java包名 com.codeedgexu.codeedgebackend

这是Java语言强制规范的代码组织方式,是给Java编译器、JVM、Spring Boot看的,用来唯一标识代码类,和项目功能强绑定。

作用

  1. 唯一标识代码类,避免重名冲突

你的controllerconfigservice这些类,全在com.codeedgexu.codeedgebackend这个包下面。

Java编译器靠【包名+类名】唯一确定一个类,比如你的启动类全限定名是com.codeedgexu.codeedgebackend.CodeEdgeBackendApplication,这个名字全局唯一,不会和别人的项目重名冲突。

  1. 决定Spring Boot的Bean扫描范围

Spring Boot启动的时候,默认只会扫描启动类所在的包以及它的子包。

比如你的启动类在com.codeedgexu.codeedgebackend下面,那它只会扫这个包下面的controllerservice,把它们注册成Bean。

如果改了代码的包名,但启动类没跟着搬到新包,Spring 就扫不到新包里的 controller、service 这些类,导致这些类不会被注册成 Bean,项目启动失败。

小贴士

  1. Java包名里,绝对不能用横杠-

因为横杠在Java里是减号运算符,不能出现在包名、类名、变量名里,编译器会直接报错。

这也是为什么我文件夹名可以叫codeedge-backend,但包名必须写成codeedgebackend的根本原因——不是我不想写一样的,是Java语法不允许。

  1. Java包名的所有部分必须全小写。

这是Java的行业通用规范,虽然语法允许大写,但不专业,且很多代码规范检查工具会报错。

Maven artifactId codeedge-backend

这是Maven项目的唯一标识,在同一个groupId下必须唯一,用来在Maven仓库里找到你的项目、打包发布、管理依赖。

作用

  1. 唯一标识你的Maven项目,和别人的项目区分开;
  2. 项目打包、发布到Maven仓库,全靠这个artifactId;
  3. 以后别人要引用你的项目,就是靠这个artifactId写依赖:
1
2
3
4
5
<dependency>
    <groupId>com.codeedgexu</groupId>
    <artifactId>codeedge-backend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

小贴士

上线后如果修改了 artifactId,项目打包出来的jar包名字会变,别人引用你的项目也要同步改artifactId,不然就找不到依赖。

推荐用kebab-case短横线分隔的格式(比如codeedge-backend),可读性好,Maven全兼容,是行业里90%的项目都会用的写法。

application.yml文件中的codeedge-backend

1
2
3
spring:
  application:
    name: codeedge-backend

这是Spring Boot应用的官方服务名,核心作用是给微服务注册中心(Nacos)看的,是你这个服务在微服务集群里的唯一标识。

作用

  1. Nacos服务注册的唯一标识

你的服务启动时,会去Nacos登记,登记的名字就是这个spring.application.name

  1. 微服务之间调用的标识

以后有其他服务要调用你的接口,就是靠这个名字在Nacos里找到你的服务地址;

小贴士

同样地,上线后如果修改了这个服务名,Nacos里注册的服务名就变了,其他服务再用旧名字找你,就完全找不到了,微服务调用直接报错。

推荐和Maven的artifactId保持一致(比如也叫codeedge-backend),这样你在看Nacos控制台的时候,一眼就能对应上“这个服务对应Maven里的哪个项目”,不会混乱。

Code Road Record