Springboot2.x + maven多模块+ 打包 + 多模块配置文件位置
参考
- https://blog.csdn.net/weixin_43726822/article/details/88562314
- https://cloud.tencent.com/developer/article/1870338 (将本地Jar包导入Maven项目的4种方式)
- https://blog.csdn.net/u010979642/article/details/108534860 (dependencymanagement 与 dependencies 区别)
- 本文代码下载
- 网关多模块demo 下载
环境
环境 | 版本 | 操作 |
---|---|---|
windows | 10 | |
vs code | 1.84.2 | |
Spring Boot Extension Pack | v0.2.1 | vscode插件 |
Extension Pack for Java | v0.25.15 | vscode插件 |
JDK | 11 | |
Springboot | 2.3.12.RELEASE | |
Apache Maven | 3.8.6 |
注意
- 通过 https://start.aliyun.com/ 应用架构选择
MVC架构
生成的代码,在打包以后运行 jar 报错:“没有主清单属性”
因为父工程和非 web 入口模块都在pom.xml
中设置了spring-boot-maven-plugin
,该配置只需要在 web 模块中设置,其他模块与父工程中的pom.xml
中都需要删除spring-boot-maven-plugin
的配置。(MVC架构
的 web 模块为 xxx-start)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.12.RELEASE</version>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
-
项目多模块好处
关于mvn多模块的理解内容和现在搜索到以及理解的内容差不多,可以参考一下。 -
父工程可以有n多个子模块,命名也不需要按照本文设置,本文这样设置是因为
start.aliyun.com
默认的MVC架构
生成的代码是这样。 -
Maven 项目有多种引入 jar 包方式。
- 指定绝对路径
- 将项目
mvn install
到本地,然后需要的项目pom.xml
中引入。 - ...
-
多模块项目默认扫描启动类所在的
@Bean
,如果子模块需要加载其他模块的@Bean
:- 在当前模块启动入口类上添加
@ComponentScan(value = {"当前包名","要扫描@Bean的包名"})
。(@ComponentScan
注解不仅要加上子模块要扫描的@Bean
位置,本模块的也要加上,不然本模块的就无法加载了) - 在当前模块启动入口类上添加
@EnableAutoConfiguration
,如果在不同模块中存在相同名称或类型的@Bean
,则会出现冲突。可以使用@Primary
注解指定一个主要的@Bean
,或者使用@Qualifier
和@Autowired
注解进行精确匹配。(by gpt) - 在当前模块启动入口类上添加
@Import({ xxxx1.class, xxxx2.class })
。(by gpt) - 在每个模块中,你可以定义一个条件类,通过实现
Condition
接口来定义条件规则,然后在该条件类中判断是否加载该模块的@Bean
。(by gpt)
- 在当前模块启动入口类上添加
正文
父工程与子模块
一个父工程可以有多个子模块,目录结构大概如下。
..
pom.xml
demo-web
pom.xml
src
demo-start
pom.xml
src
demo-service
pom.xml
src
- 父工程 pom.xml 需要指定
packaging
为pom
(默认为jar
),以及引入子模块:
<packaging>pom</packaging>
<modules>
<module>demo-start</module>
<module>demo-web</module>
<module>demo-service</module>
</modules>
- 所有子模块都需要指定所属父工程(demo-web、demo-start、demo-service子模块的
pom.xml
中都需要设置):
<!--子模块名称,在引入的时候用到,如果是demo-start的pom.xml,那就设置为<artifactId>demo-start</artifactId>-->
<artifactId>xxx</artifactId>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
-
dependencymanagement 与 dependencies 区别
- dependencies
如果在父 pom 中定义了某个依赖,那么所有子 pom 都会自动继承这个依赖。 - dependencyManagement
dependencyManagement 中声明的依赖,仅仅是声明,并没有真正的引入依赖。这样子模块可以从声明的依赖中,选择自己需要的,而不会继承所有父 pom 中的依赖。
dependencyManagement 中除了声明依赖,还指定了依赖的版本。这样在子模块的依赖中,就无须指定版本,而是使用 dependencyManagement 指定的版本。
dependencyMent dependencies 使用位置 通常是父 pom。 父 pom 与子 pom。 版本 定义版本,子模块继承时无需指定版本,避免版本混乱。当然也可以使用别的版本进行覆盖,不过一般不这么用。 子模块可以什么也不做来继承父 pom 的依赖,也可以使用别的版本的依赖进行覆盖。 继承方式 子模块需要在自己的 dependencies 中指定要继承哪些依赖。 子模块什么都不做即可默认继承。 是否被子模块继承 可以被子模块选择性的继承,避免无效继承。 所有父 pom 中定义的依赖会被所有子模块继承。 是否引入依赖 只是声明,没有引入依赖,只有在子模块中继承才会真正的引入依赖。 是。 - dependencies
-
配置文件
- 当子模块未引入其他模块,则无法读取其他模块的配置。
- 当子模块引入其他模块后,可以读取引入模块的配置。
- 当子模块引入其他模块后,其他模块的相同配置会覆盖当前模块的配置项。
- 多模块配置文件可以放到 web 入口模块的配置文件中,经过测试别的模块可以获取到。
打包
命令位置默认为:父工程目录
- 打包
mvn clean package
- 运行 jar
java -jar ./start/target/demo-start-0.0.1-SNAPSHOT.jar
博 主 :夏秋初
地 址 :https://www.cnblogs.com/xiaqiuchu/p/17902520.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
地 址 :https://www.cnblogs.com/xiaqiuchu/p/17902520.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!