在创建springboot项目的时候,我们希望一个主题的多个子模块可以共享彼此的逻辑。springboot强调为服务,各自为战。但是我还是希望可以将同一个主题的多个springboot程序放在一起,它们可以共享通用的javabean、DAO和业务逻辑代码。
下面是helloWorld的项目结构:
helloWorld ├── helloWorld-commons //通用的javabean和工具类 │ ├── pom.xml │ ├── src │ └── target ├── helloWorld-dao // jdbc的 DAO │ ├── pom.xml │ ├── src │ └── target ├── helloWorld-service // 业务逻辑服务类 │ ├── pom.xml │ ├── src │ └── target ├── helloWorld-web // web程序 │ ├── pom.xml │ ├── src │ └── target └── pom.xml
下面是根pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.kanpiaoxue</groupId> <artifactId>helloWorld</artifactId> <version>0.0.1</version> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <modules> <module>helloWorld-commons</module> <module>helloWorld-dao</module> <module>helloWorld-service</module> <module>helloWorld-web</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.source.version>1.8</java.source.version> <java.target.version>1.8</java.target.version> </properties> <dependencyManagement> <dependencies> <!-- 这里配置各个模块需要的通用依赖,但是不配置 springboot 的各个依赖。 springboot的各个依赖配置在各个module中 --> ... </dependencies> </dependencyManagement> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>${java.source.version}</source> <target>${java.target.version}</target> <encoding>utf8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.4.3</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> <configuration> <skipTests>false</skipTests> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
helloWorld-commons 模块的pom.xml: 注意它使用到了log日志,注意它是如何在pom里面引用log的。
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.kanpiaoxue</groupId> <artifactId>helloWorld</artifactId> <version>0.0.1</version> </parent> <artifactId>helloWorld-commons</artifactId> <name>helloWorld-commons</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- log start --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <!-- log end --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <!-- start apache --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> <!-- end apache --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <!-- test start --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4-rule-agent</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock.tests</groupId> <artifactId>powermock-tests-utils</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-core</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-classloading-xstream</artifactId> <scope>test</scope> </dependency> <!-- test end --> </dependencies> </project>
其他模块的pom.xml 就不一一罗列了,这里最关键是helloWorld-web的pom.xml 因为只有它才是真正的springboot的可执行程序。它的pom.xml如下:
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.kanpiaoxue</groupId> <artifactId>hello</artifactId> <version>0.0.1</version> </parent> <artifactId>hello-web</artifactId> <name>hello-web</name> <packaging>jar</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <helloWorld.version>0.0.1</helloWorld.version> </properties> <dependencies> <dependency> <groupId>org.kanpiaoxue</groupId> <artifactId>helloWorld-commons</artifactId> <version>${helloWorld.version}</version> </dependency> <dependency> <groupId>org.kanpiaoxue</groupId> <artifactId>helloWorld-dao</artifactId> <version>${helloWorld.version}</version> </dependency> <dependency> <groupId>org.kanpiaoxue</groupId> <artifactId>helloWorld-service</artifactId> <version>${helloWorld.version}</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency> <!-- springboot start --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- springboot start --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> <!-- end apache --> <!-- DBPool start --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> </dependency> <!-- DBPool end --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <!-- test start --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4-rule-agent</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock.tests</groupId> <artifactId>powermock-tests-utils</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-core</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-classloading-xstream</artifactId> <scope>test</scope> </dependency> <!-- test end --> </dependencies> <!-- spring-boot-maven-plugin start --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
【特别注意】
这里需要额外注意一个问题:带有 @SpringBootApplication 的 Application.java(内含publicstaticvoid main(String[] args))方法的类,一定要放在几个module公用的package的那一层级,否则会引起找不到各个@Servce等注解类的情况。
org.kanpiaoxue.helloworld_commons org.kanpiaoxue.helloworld_dao org.kanpiaoxue.helloworld_service org.kanpiaoxue.helloworld_web
针对上面的几个module,它们各自有自己的package。如上。
我在 org.kanpiaoxue.helloworld_web 下面创建了带有 @SpringBootApplication 的 Application.java(内含public static void main(String[] args))方法的类,启动程序的是否发现总是有服务类无法被扫描到。因为 @SpringBootApplication 是从当前 Application.java 所在的package:org.kanpiaoxue.helloworld_web 向下扫描的,它自然无法扫描到其他的几个package:
org.kanpiaoxue.helloworld_commons
org.kanpiaoxue.helloworld_dao
org.kanpiaoxue.helloworld_service
解决方案:将带有 @SpringBootApplication 的 Application.java(内含public static void main(String[] args))方法的类,挪到这几个module公用的package的路径:
org.kanpiaoxue
下面,就解决了该问题。
我发现也有人遇到类似的问题,可以参考:
关于SpringBoot bean无法注入的问题(与文件包位置有关)改变自动扫描的:https://blog.csdn.net/u014695188/article/details/52263903
还有一种解决Application.java找不到各种@Service的方法就是在@SpringBootApplication里面添加包的扫描路径。如下:
@SpringBootApplication(scanBasePackages = "org.kanpiaoxue") @EnableTransactionManagement @MapperScan("org.kanpiaoxue.csis.dao") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
相关推荐
总的来说,"Springboot 多模块 maven 配置实例"旨在展示如何在Spring Boot项目中通过Maven进行模块化的管理,提高项目的可维护性和可扩展性。通过这样的方式,我们可以更好地组织代码,使得大型项目更加有序,同时也...
本文主要介绍了 SpringBoot+Maven 多模块项目的构建、运行、打包实战,将 Maven 多模块项目与 SpringBoot 进行集成,通过一个实际的示例项目,展示了如何使用 Maven 构建多模块项目,如何在 IDEA 中创建 SpringBoot ...
springboot-multi-module-v2:docker部署maven构建多模块springboot项目
1、里面有聚合工程创建和配置的详细文档。 2、Springboot创建聚合工程/springboot中如何使用maven module工程/springboot子工程之间如何相互调用依赖
然后,创建子模块 boot_test_oneserver,并选择 Maven Module 项目类型。 依赖版本管理 在 pom 文件中,需要进行依赖版本管理,以便正确地依赖项目所需的组件。常用的依赖项包括 Springboot 启动器、热部署、...
本文将详细介绍如何在IDEA中运行一个SpringBoot项目,包括必要的环境准备、配置Maven、设置JDK环境以及数据库配置。 首先,确保你已安装了以下基本组件: 1. IDEA:这是开发Java应用的IDE,它提供了丰富的功能和...
通过以上步骤,我们就完成了基于Spring Boot、IntelliJ IDEA和Maven的多模块项目搭建,并实现了与数据库的连接和测试。这样的项目结构使得代码组织清晰,模块化程度高,易于维护和扩展。对于大型项目来说,这种架构...
在这个"Springboot多模块整合Mybatis Maven项目"中,我们将深入探讨这些技术的集成和使用。 首先,我们来看Spring Boot。Spring Boot的核心理念是"约定优于配置",它内置了大量默认配置,如Tomcat服务器、Spring ...
在本教程中,我们将深入探讨如何使用IntelliJ IDEA(简称IDEA)创建一个基于Gradle的多模块(Multi-Module)Spring Boot项目。Spring Boot以其便捷的快速启动和简化配置而闻名,而Gradle作为现代构建工具,提供了...
本文将以"springboot-multimodule-maven"为例,深入探讨Spring Boot结合Maven实现多模块项目的方法和最佳实践。 首先,"springboot-multimodule-maven"项目是一个基于Maven的Spring Boot多模块模板。Maven作为Java...
Maven聚合项目(Multi-module Project)是Maven中处理多个子项目的一种方式。通过聚合项目,我们可以将相关的子项目组织在一起,统一管理依赖和构建流程。在本案例中,它可能包含了多个SpringBoot模块,如服务模块...
SpringBoot 项目依赖 jar 包一起打包问题解决 SpringBoot 项目在打包时,经常会遇到依赖的 jar 包没有被一起打包的问题,这个问题的解决方案将在本文中详细介绍。解决这个问题的关键在于在 pom.xml 文件中添加正确...
在大型项目中,为了保持代码的清晰性和可维护性,通常会采用多模块(Module)的方式来组织项目结构。本文将深入探讨如何在IntelliJ IDEA(Idea)中创建一个基于Spring Boot的多模块项目,以及这样做的好处。 首先,...
在Spring Boot中,创建一个Maven多模块项目可以帮助我们更好地组织和管理代码,尤其是当项目变得庞大时。本文将详细讲解如何使用Spring Initializr来构建一个包含多个子模块的Spring Boot项目。 首先,我们需要理解...
1. 创建Maven多模块项目,包含上述两个子模块。 2. 在每个模块的pom.xml中分别引入Spring Boot、Dubbo和MyBatis的依赖。 3. 配置Dubbo的provider和consumer,包括服务接口、实现类、zookeeper注册中心等。 4. 使用...
Gradle支持多项目构建,可以通过以下步骤创建多模块SpringBoot项目: 1. **创建主项目** 主项目通常包含所有子项目的配置信息,`settings.gradle`文件列出所有子模块: ```groovy include 'module1', 'module2' ...
在 SpringBoot 项目中,模块化可以通过 Maven 的多模块项目来实现。首先,创建一个父项目(parent),然后在父项目中定义多个子模块(module)。每个子模块都可以单独维护和部署。 父项目配置 在父项目的 pom.xml ...
springBoot 2.0开发构建多模块应用及使用Maven进行项目打包。 1. 定义用户模型:ID、名称 2. 客户端发送 POST 请求,创建用户(Web MVC形式) 3. 客户端发送 GET 请求,获取所有用户(Web Flux形式——Spring...
一个标准的Spring Boot多模块项目通常包括以下部分:父模块(parent)、应用主模块(application)、以及各个功能模块(module)。每个模块都有明确的职责,Service层则主要负责处理业务逻辑,它依赖于Repository层...
Maven是Java项目中最常用的构建工具之一,它能够帮助开发者自动处理依赖关系管理、编译、测试、打包等任务。因此,在创建Spring Boot项目后,首先需要配置Maven支持。 1. **添加Maven支持**: - 在IDEA中打开项目...