Java maven 多模块工程

妖精的绣舞 提交于 2020-01-14 20:02:36

Java maven 多模块工程

利用Maven可以方便的构建Java项目的多模块工程,例如,一个多模块工程包括:公共代码模块、web服务模块、独立java应用模块。
root:

  • common_module
  • web_module
  • jar_module
    项目结构

1. 根项目(root)

根项目用来管理各个子模块,定义公共依赖的版本。这里将根项目继承自spring-boot-starter-parent,便于采用spring-boot默认的依赖版本,
pom文件如下:

<?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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.fcg.demo</groupId>
    <artifactId>multiproject01_root</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--定义各个子模块,便于统一编译、打包-->
    <modules>
        <module>common_module</module>
        <module>web_modle</module>
        <module>jar_module</module>
    </modules>
    <!--根项目打包形式,必须为pom-->
    <packaging>pom</packaging>
    <description>根工程,定义各个模块通用的依赖</description>

    <!--properties标签,定义依赖的版本-->
    <properties>
        <java.version>1.8</java.version>
        <fastjson.version>1.2.62</fastjson.version>
        <commons_lang3.version>3.9</commons_lang3.version>
        <commons_beanutils.version>1.9.4</commons_beanutils.version>
        <commons_collections4.verison>4.4</commons_collections4.verison>
        <lombok.version>1.18.10</lombok.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>${commons_beanutils.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>${commons_collections4.verison}</version>
        </dependency>
    </dependencies>

</project>

2. 公共模块(common)

公共模块提供工具类、公用bean等,此处定义了一个bean,一个util:

package com.fcg.multiproject01.commonmodule.bean;

import lombok.Builder;
import lombok.Data;

/**
 * 一个二叉树节点
 *
 * @author FCG
 */
@Data
@Builder
public class NodeBean {
    private String name;
    private NodeBean left;
    private NodeBean right;
    private Object content;
}

package com.fcg.multiproject01.commonmodule.util;

import java.util.UUID;

/**
 * @author FCG
 */
public class UUIDUtil {
    public static String generateId() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
}

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">
    <parent>
        <artifactId>multiproject01_root</artifactId>
        <groupId>com.fcg.demo</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>common_module</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <description>公用模块</description>

    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons_lang3.version}</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>

3. web服务模块

web服务模块,提供后台接口,运用spring-boot框架:

package com.fcg.multiproject01.webmodule.controller;

import com.alibaba.fastjson.JSON;
import com.fcg.multiproject01.commonmodule.bean.NodeBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author FCG
 */
@Slf4j
@RestController
public class NodeController {
    @RequestMapping("node")
    public Object getNodes() {
        NodeBean left = NodeBean.builder().name("left01").build();
        NodeBean right = NodeBean.builder().name("right01").build();
        NodeBean root = NodeBean.builder().name("root").left(left).right(right).build();
        String str = JSON.toJSONString(root);
        log.info(str);
        return str;
    }
}


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">
    <parent>
        <artifactId>multiproject01_root</artifactId>
        <groupId>com.fcg.demo</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>web_modle</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <description>一个web后台服务模块</description>

    <dependencies>
        <!--依赖公共模块-->
        <dependency>
            <groupId>com.fcg.demo</groupId>
            <artifactId>common_module</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!--采用spring-boot打包方式-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4. java独立应用模块

打包成一个jar包,可以独立运行,处理一些后台数据:

package com.fcg.multiproject01.jarmodule;


import com.fcg.multiproject01.commonmodule.util.UUIDUtil;

/**
 * @author FCG
 */
public class Scheduler {
    public static void main(String[] args) throws InterruptedException {
        int i = 0;
        while (i < 10) {
            System.out.println(i + ":生成uuid:" + UUIDUtil.generateId());
            Thread.sleep(1000);
            i++;
        }
        System.out.println("结束..");
        System.exit(0);
    }
}

<?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">
    <parent>
        <artifactId>multiproject01_root</artifactId>
        <groupId>com.fcg.demo</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>jar_module</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <description>jar应用模块</description>

    <properties>
        <java.version>1.8</java.version>
        <!--定义程序启动时运行的主类-->
        <start-class>com.fcg.multiproject01.jarmodule.Scheduler</start-class>
    </properties>

    <dependencies>
        <!--依赖公共模块-->
        <dependency>
            <groupId>com.fcg.demo</groupId>
            <artifactId>common_module</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--打包成能通过java -jar命令,运行的jar包-->
            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                        implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer">
                                    <resource>META-INF/spring.factories</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>${start-class}</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
                <configuration>
                    <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

独立运行的java程序,采用maven-shade-plugin打包,参考spring-boot-parent中对该插件的配置,去除spring中的重复配置文件,通过标签,指定程序启动时运行的主类。

打包后能正常运行

正常运行

接口调用

代码仓库

https://gitee.com/thanksm/multiproject01

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!