`
kanpiaoxue
  • 浏览: 1777345 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

springboot项目maven多module

 
阅读更多

在创建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配置实例

    总的来说,"Springboot 多模块 maven 配置实例"旨在展示如何在Spring Boot项目中通过Maven进行模块化的管理,提高项目的可维护性和可扩展性。通过这样的方式,我们可以更好地组织代码,使得大型项目更加有序,同时也...

    SpringBoot+Maven 多模块项目的构建、运行、打包实战

    本文主要介绍了 SpringBoot+Maven 多模块项目的构建、运行、打包实战,将 Maven 多模块项目与 SpringBoot 进行集成,通过一个实际的示例项目,展示了如何使用 Maven 构建多模块项目,如何在 IDEA 中创建 SpringBoot ...

    springboot-multi-module-v2:docker部署maven构建多模块springboot项目

    springboot-multi-module-v2:docker部署maven构建多模块springboot项目

    Eclipse快速搭建Springboot项目

    然后,创建子模块 boot_test_oneserver,并选择 Maven Module 项目类型。 依赖版本管理 在 pom 文件中,需要进行依赖版本管理,以便正确地依赖项目所需的组件。常用的依赖项包括 Springboot 启动器、热部署、...

    IDEA如何运行SpringBoot项目

    本文将详细介绍如何在IDEA中运行一个SpringBoot项目,包括必要的环境准备、配置Maven、设置JDK环境以及数据库配置。 首先,确保你已安装了以下基本组件: 1. IDEA:这是开发Java应用的IDE,它提供了丰富的功能和...

    springboot+idea+maven 多模块项目搭建的详细过程(连接数据库进行测试)

    通过以上步骤,我们就完成了基于Spring Boot、IntelliJ IDEA和Maven的多模块项目搭建,并实现了与数据库的连接和测试。这样的项目结构使得代码组织清晰,模块化程度高,易于维护和扩展。对于大型项目来说,这种架构...

    Springboot多模块 整合 mybatis maven项目

    在这个"Springboot多模块整合Mybatis Maven项目"中,我们将深入探讨这些技术的集成和使用。 首先,我们来看Spring Boot。Spring Boot的核心理念是"约定优于配置",它内置了大量默认配置,如Tomcat服务器、Spring ...

    [SpringBoot学习]-IDEA创建Gradle多Module结构的SpringBoot项目代码

    在本教程中,我们将深入探讨如何使用IntelliJ IDEA(简称IDEA)创建一个基于Gradle的多模块(Multi-Module)Spring Boot项目。Spring Boot以其便捷的快速启动和简化配置而闻名,而Gradle作为现代构建工具,提供了...

    springboot-multimodule-maven

    本文将以"springboot-multimodule-maven"为例,深入探讨Spring Boot结合Maven实现多模块项目的方法和最佳实践。 首先,"springboot-multimodule-maven"项目是一个基于Maven的Spring Boot多模块模板。Maven作为Java...

    SpringBoot聚合项目

    Maven聚合项目(Multi-module Project)是Maven中处理多个子项目的一种方式。通过聚合项目,我们可以将相关的子项目组织在一起,统一管理依赖和构建流程。在本案例中,它可能包含了多个SpringBoot模块,如服务模块...

    SpringBoot项目没有把依赖的jar包一起打包的问题解决

    SpringBoot 项目依赖 jar 包一起打包问题解决 SpringBoot 项目在打包时,经常会遇到依赖的 jar 包没有被一起打包的问题,这个问题的解决方案将在本文中详细介绍。解决这个问题的关键在于在 pom.xml 文件中添加正确...

    idea spring boot 多模块项目创建

    在大型项目中,为了保持代码的清晰性和可维护性,通常会采用多模块(Module)的方式来组织项目结构。本文将深入探讨如何在IntelliJ IDEA(Idea)中创建一个基于Spring Boot的多模块项目,以及这样做的好处。 首先,...

    springboott创建maven多模块项目1

    在Spring Boot中,创建一个Maven多模块项目可以帮助我们更好地组织和管理代码,尤其是当项目变得庞大时。本文将详细讲解如何使用Spring Initializr来构建一个包含多个子模块的Spring Boot项目。 首先,我们需要理解...

    Spring Boot集成dubbo,mybatis构建maven工程

    1. 创建Maven多模块项目,包含上述两个子模块。 2. 在每个模块的pom.xml中分别引入Spring Boot、Dubbo和MyBatis的依赖。 3. 配置Dubbo的provider和consumer,包括服务接口、实现类、zookeeper注册中心等。 4. 使用...

    基于SpringBoot的Gradle工程

    Gradle支持多项目构建,可以通过以下步骤创建多模块SpringBoot项目: 1. **创建主项目** 主项目通常包含所有子项目的配置信息,`settings.gradle`文件列出所有子模块: ```groovy include 'module1', 'module2' ...

    springboot 多模块将dao(mybatis)项目拆分出去

    在 SpringBoot 项目中,模块化可以通过 Maven 的多模块项目来实现。首先,创建一个父项目(parent),然后在父项目中定义多个子模块(module)。每个子模块都可以单独维护和部署。 父项目配置 在父项目的 pom.xml ...

    springBoot 2.0开发构建多模块应用及项目打包(IDEA工具)开发源码

    springBoot 2.0开发构建多模块应用及使用Maven进行项目打包。 1. 定义用户模型:ID、名称 2. 客户端发送 POST 请求,创建用户(Web MVC形式) 3. 客户端发送 GET 请求,获取所有用户(Web Flux形式——Spring...

    SpringBoot 多模块 Serivce 层单元测试

    一个标准的Spring Boot多模块项目通常包括以下部分:父模块(parent)、应用主模块(application)、以及各个功能模块(module)。每个模块都有明确的职责,Service层则主要负责处理业务逻辑,它依赖于Repository层...

    新建springboot项目后需要配置的内容.pdf

    Maven是Java项目中最常用的构建工具之一,它能够帮助开发者自动处理依赖关系管理、编译、测试、打包等任务。因此,在创建Spring Boot项目后,首先需要配置Maven支持。 1. **添加Maven支持**: - 在IDEA中打开项目...

    IDEA使用Gradle构建SpringBoot项目工程的详细教程

    Gradle不仅支持多项目构建,还能处理复杂的依赖管理和构建过程。 在开始构建Spring Boot项目之前,我们需要确保已经安装了IntelliJ IDEA和Gradle。在IDEA中创建新项目时,选择“Gradle”作为构建工具。接着,按照...

Global site tag (gtag.js) - Google Analytics