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中的重复配置文件,通过标签,指定程序启动时运行的主类。
打包后能正常运行
代码仓库
来源:CSDN
作者:thanksm1
链接:https://blog.csdn.net/thanksm1/article/details/103973180