`
kanpiaoxue
  • 浏览: 1753822 次
  • 性别: 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);
    }

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics