游戏服务器搭建过程中Maven多模块编译遇到的一些问题

news2024/10/6 20:37:09

        

目录

1、多模块的创建

1.1 父模块的创建

 1.2 删除垃圾文件

1.3 修改pom.xml

1.4 创建子模块继承

2、子模块之间的互相引用

3、多个模块间版本的管理

3.1 dependencis

3.2 dependencyManagement

4、依赖执行

5、在Spring Boot项目中加载依赖项目的组件有几种常用的方法

5.1. 使用@ComponentScan注解:

2. 使用@Import注解:

3. 使用@Configuration注解和@Bean方法:

6、@ComponentScan 扫描依赖项的包


        游戏服务器有好几个项目,所以涉及到多个模块,这个开发中也是经常遇到的,但是因为之前一直没怎么关注,所以在开发的过程中的一些细节问题还是不懂,这次记录下,也分享下同样的问题给没试过的同学

1、多模块的创建

使用idea进行模块的创建,主要分为以下几步

1.1 父模块的创建

直接创建一个Maven项目,在这个过程中选择了Spring web 和Lombok,也可以选择其他的包,到时候省的手写

 1.2 删除垃圾文件

删除所有的文件,只留下pom.xml就行,因为父模块只是做一个模块和依赖管理的作用,因此不需要代码。

1.3 修改pom.xml

修改这个父模块的pom.xml文件,首先把<dependencies>节点、<build>节点和<properties>全部删除:然后修改版本号为自己定义的(方便后续子模块指定父模块)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>MultMoudle</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MultMoudle</name>
    <description>MultMoudle</description>
    <packaging>pom</packaging>
</project>

1.4 创建子模块继承

 继承父模块

可以看到父模块的pom中,已经有子模块的配置了。

2、子模块之间的互相引用

因为有一些接口文件需要在几个项目中共同使用,所以就要抽取相同的文件到common项目中,这个是非常合理的,在room和game中怎么引用呐,非常简单,和其他的jar包一样

        <dependency>
            <groupId>com.pdool</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

使用坐标和版本进行引用,刷新引用就可以在引用中看到了

 

3、多个模块间版本的管理

多个模块中使用的依赖很有可能会有重复,但是怎么管理各个版本呐?

假设上述module-onemodule-two都需要依赖fastjson2,我们之前会在两个模块的pom.xml中加入依赖,但是这样重复的配置看起来似乎不太优雅,如果需要升级要改2个地方,这个时候parent模块的管理功能就可以发挥了

3.1 dependencis

 在上图中,在dependencis中加入了两个常用的工具库,在子模块中即使不加入也可以使用这个库了!因为子模块除了可以使用自己的依赖之外,还会向上查找父模块的依赖,也就是说,父模块的依赖是向下继承的,因此对于所有模块都要使用的依赖,我们可以写在父模块中。

所以,两个模块都依赖于Spring Web话,也可以将两个模块的Spring Web依赖移至父模块。

所以说父模块和子模块中,依赖也有着继承的关系!父模块的properties也是向下继承的。

3.2 dependencyManagement

dependencyManagement用于管理依赖的版本,我们在父模块的pom.xml加入这个标签:

dependencyManagement的注意事项:

  • dependencyManagement仅用于管理版本,而不会为自己以及子模块导入依赖,因此在dependencyManagement中声明依赖后,对应的子模块仍然需要在dependencies中加入依赖
  • pom.xmldependencyManagementdependencies同级,并且dependencyManagement中也需要有一个dependencies
  • dependencyManagement不仅可以管理子模块的依赖版本,也可以管理自身的依赖版本
  • 若不想让某个子模块使用父模块dependencyManagement的版本,那就在这个子模块的dependencies中声明对应版本

4、依赖执行

因为在项目中使用了mybatis-plus ,在common模块中定义了一些mapper,在room和game中需要使用,在项目中增加了componentscan ,但是依然在运行的时候报错,提示找不到common中的类,在编辑器中并不报错,这很奇怪,需要在依赖项目中增加一个标签。

这是由于Spring Boot打包的模式问题,我们打开被依赖模块module-twopom.xml文件找到最下面<build>节点中,在spring-boot-maven-plugin插件部分中加入下面配置:

<classifier>exec</classifier>

最终common中pom的定义

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>execute</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

5、在Spring Boot项目中加载依赖项目的组件有几种常用的方法

在Spring Boot项目中加载依赖项目的组件有几种常用的方法:

5.1. 使用@ComponentScan注解:

在主应用程序类上使用@ComponentScan注解,指定要扫描的包路径。这将使Spring Boot扫描并加载依赖项目中带有@Component、@Service、@Repository等注解的组件。例如:

   @SpringBootApplication
   @ComponentScan(basePackages = "com.example.dependencyproject")
   public class MyApplication {
       // ...
   }

2. 使用@Import注解:

在主应用程序类上使用@Import注解,引入依赖项目中的配置类或组件类。这将使Spring Boot加载这些配置类并注册其中的组件。例如:

   @SpringBootApplication
   @Import(com.example.dependencyproject.MyConfiguration.class)
   public class MyApplication {
       // ...
   }

3. 使用@Configuration注解和@Bean方法:

如果依赖项目中有@Configuration注解的配置类,可以在主应用程序类中使用@Bean方法来加载其中的组件。例如:

   @SpringBootApplication
   public class MyApplication {
       // ...
       
       @Bean
       public MyComponent myComponent() {
           return new MyComponent();
       }
   }

   这样,MyComponent将作为一个Bean被加载到Spring应用程序上下文中。

根据你的具体情况和依赖项目的结构,你可以选择适合的方法来加载依赖项目的组件。请注意,为了能够加载依赖项目的组件,确保依赖项目已被正确地添加为项目的依赖项,并且在构建和部署过程中能够被正确地引用和访问。

6、@ComponentScan 扫描依赖项的包

@ComponentScan 注解可以用于指定要扫描的包,它的作用不限于只扫描依赖项的包。@ComponentScan`可以扫描指定包及其子包下的组件,并将其加载到应用程序的上下文中。

当你在 Spring Boot 应用程序的主类上使用 `@ComponentScan` 注解时,它将扫描指定的包及其子包,并注册在这些包中使用了 `@Component`、`@Service`、`@Repository`、`@Controller` 等注解的组件。

如果你指定的包路径包括了依赖项的包,那么它将扫描并加载依赖项中的组件。但是需要注意,`@ComponentScan` 不会限制只扫描依赖项的包,它将扫描所有指定的包路径下的组件。

举个例子,假设你的 Spring Boot 应用程序的主类上使用了以下的 `@ComponentScan` 注解:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.myapp", "com.example.dependency"})
public class MyApplication {
    // ...
}

在上述示例中,`@ComponentScan` 将扫描 `com.example.myapp` 包及其子包以及 `com.example.dependency` 包及其子包下的组件,并将它们加载到应用程序的上下文中。这样,你可以同时加载依赖项中的组件和应用程序本身的组件。

总之,`@ComponentScan` 注解不仅限于扫描依赖项的包,它可以扫描指定包及其子包下的所有组件,并将它们加载到应用程序的上下文中。

注:

如果你在 Spring Boot 应用程序的主类上使用了 @ComponentScan 注解,并指定了包路径,只有在指定的包路径下的本项目组件会被自动加载到应用程序的上下文中。

@ComponentScan 注解仅扫描指定的包及其子包下的组件,并将它们加载到应用程序的上下文中。如果本项目中的组件不在指定的包路径下,它们将不会被自动加载。

7、总结

不做不知道,手高眼低不行,必须得实践


京东链接:https://item.jd.com/14010448.html

特色

不留遗漏:全面覆盖Dubbo核心知识点

直击要害:实战化案例精准定位技术细节

学以致用:精要式演示确保开发、学习不脱节

潜移默化:研磨式知识讲解渗透技术要点

提升效率:垂直式技术精讲不饶弯路

循序提升:渐进式知识点编排确保连贯

配套资源:赠送全书案例源文件助力学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十一、PBR材质金属度、粗糙度以及环境贴图的使用

Three.js——十一、PBR材质金属度、粗糙度以及环境贴图的使用 metalness金属度 金属度属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。 new THREE.MeshStandardMaterial({metalness: 1.0,//金属度属性 }) // 或者 // mesh.material.met…

Java面试题-并发篇(2万字带你搞定并发问题)

Java面试题-并发篇 一、线程 1. 线程和进程有什么区别&#xff1f; 线程具有许多传统进程所具有的特征&#xff0c;故又称为轻型进程(Light—Weight Process)或进程元&#xff1b;而把传统的进程称为重型进程(Heavy—Weight Process)&#xff0c;它相当于只有一个线程的任务…

山西电力市场日前价格预测【2023-07-12】

日前价格预测 预测明日&#xff08;2023-07-12&#xff09;山西电力市场全天平均日前电价为446.44元/MWh。其中&#xff0c;最高日前价格为584.92元/MWh&#xff0c;预计出现在12: 00。最低日前电价为325.62元/MWh&#xff0c;预计出现在00: 30。 价差方向预测 1&#xff1a;实…

【操作系统】磁盘调度算法 先来先服务、最短寻道时间优先、扫描算法、循环扫描算法

目录 一、实验要求二、实验原理三、实验内容四、实验结果五、总结 一、实验要求 设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、扫描算法SCAN和循环扫描算法CSCAN的工作过程。假设有n个磁道号所组成的磁道访问序列&#xff0c;给定开始磁道号m和磁头移动的方向(正向或者反…

【sgRectSelect】Vue实现拖拽鼠标圈选、划区域、框选组件:矩形区域选中checkbox,并回调相关选中、取消选中的操作

边框线虚线动画效果请参阅边框虚线滚动动画特效_虚线滚动效果_你挚爱的强哥的博客-CSDN博客【代码】边框虚线滚动动画特效。_虚线滚动效果https://blog.csdn.net/qq_37860634/article/details/130507289 碰撞检测原理请前往 原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞…

嵌入式c语言编码规范

学习嵌入式的同学应该首先掌握嵌入式编码规范&#xff0c;这样才能更好的嵌入式系统。 下面就从这几个方面讲解一下嵌入式c编码规范。 注释风格、排版风格、头文件风格、变量定义、宏定义、函数 1 注释风格 1.1 注释的原则是有助于对程序的阅读和理解&#xff0c;注释不宜太多…

通过(.zip 压缩文件)安装及卸载MySQL

文章目录 一、MySQL安装1.下载MySQL压缩包2.将下载好的压缩包解压到一个没有中文路径的目录下3.配置MySQL环境变量4.验证是否配置成功5.初始化MySQL数据库6.注册MySQL服务7.启动MySQL服务8.修改MySQL数据库默认账户密码9.登录MySQL数据库10.退出MySQL 二、MySQL卸载1.以管理员身…

什么是EDI 180 退货授权和通知?

EDI 180 退货授权和通知是零售商和供应商在退货过程中使用的电子数据交换&#xff08;EDI&#xff09;文件。它既可以作为请求和授权&#xff0c;也可以作为通知文件。 EDI 180 的基本组成部分是什么&#xff1f; EDI 180 交易需要包括有关退货的关键信息。由于EDI 180可以双…

Linux 批量杀掉进程(包含某个关键字)

一、场景说明 现场环境有十多个包含 ”celery” 关键字的进程在运行&#xff0c;每次重启服务&#xff0c;需要将这些进行kill掉&#xff0c;然后重新启动。 可以用如下命令批量kill掉这些进程&#xff1a; kill -9 PID1 PID2 PID3 PID4.....其中&#xff0c;PID是查询到的进…

第九章——内存模型和名称空间

单独编译 C允许程序员将组件函数放在独立的文件中。下面列出了头文件中常包含的内容&#xff1a; 函数原型使用#define或const定义的符号常量结构声明类声明模板声明内联函数 将结构声明放在头文件中是可以的&#xff0c;因为它们不创建变量&#xff0c;而只是在源代码文件…

数据结构--树的存储结构

数据结构–树的存储结构 树的逻辑结构 树是 n ( n ≥ 0 &#xff09; n (n\ge0&#xff09; n(n≥0&#xff09;个结点的有限集合&#xff0c;n 0 时&#xff0c;称为空树&#xff0c;这是一种特殊情况。 在任意一棵非空树中应满足: 1&#xff09;有且仅有一个特定的称为 根 …

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

操作系统接口 MIT 6.828 - 1. Lab 01: Xv6 and Unix utilities

本文会将lab1中的思路以及知识点进行分析&#xff0c;并作为作者学习MIT 6.828的一个学习总结&#xff0c;希望能够帮助到学习该lab的同学们 中文版书籍&#xff1a;中文版书籍 实验教案地址&#xff1a;教案地址 操作系统接口 在操作系统中&#xff0c;为了能够有效地与操作系…

Amelia、Bookly 和 Booked:哪个WordPress预约插件更好?

各种企业都需要预订软件来管理预约。然而&#xff0c;开发预订系统是网站中最复杂和最昂贵的元素之一。 那些使用 WordPress 构建网站的人有一个优势。只需点击几下&#xff0c;他们就可以将预约插件集成到他们的网站中。 预约插件是一个预订向导&#xff0c;可以自动执行和管…

数据结构——堆的实现(细)

目录 1.1 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆…

Netty核心技术十--Netty 核心源码剖析

1. 基本说明 只有看过Netty源码&#xff0c;才能说是真的掌握了Netty框架。 在 io.netty.example 包下&#xff0c;有很多Netty源码案例&#xff0c;可以用来分析 2. netty 启动过程源码分析 本次分析使用的是example包下的echo 2.1 源码剖析的目的 用源码分析的方式走一下…

Java 动态规划 Leetcode 63. 不同路径 II

该题大部分思路可以根据Leetcode 62. 不同路径这篇博客了解 这里进行基于上面那篇博客后来对该题进行补充 代码展示&#xff1a; class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int mobstacleGrid.length;int nobstacleGrid[0].length;//创建…

HDFS块详解

HDFS块详解 传统型分布式文件系统的缺点 现在想象一下这种情况&#xff1a;有四个文件 0.5TB的file1&#xff0c;1.2TB的file2&#xff0c;50GB的file3&#xff0c;100GB的file4&#xff1b;有7个服务器&#xff0c;每个服务器上有10个1TB的硬盘。 在存储方式上&#xff0c;我…

Docker安装ElasticSearch8.X docker安装elasticsearch8.X完整详细教程

Docker安装ElasticSearch8.X docker安装elasticsearch8.X完整详细教程 Docker 上安装 ElasticSearch 8.8.1 的步骤&#xff1a;选择要安装的ElasticSearch 版本1、拉取 ElasticSearch 镜像2、创建并运行容器关闭容器启动容器重启容器 3、elasticsearch常用端口以及作用4、测试&…

基于spring cloud alibaba的低代码核心工具,jvs-logic逻辑引擎

在现代企业管理中&#xff0c;决策扮演着至关重要的角色。然而&#xff0c;随着业务规模的扩大和数据量的增加&#xff0c;人工决策变得越来越困难和耗时&#xff0c;而且容易受到主观因素的影响。逻辑引擎的出现为企业提供了一种高效、准确的决策推理工具&#xff0c;能够以逻…