【问题标题】:How to package a maven multi-module properly?如何正确打包 Maven 多模块?
【发布时间】:2018-02-17 11:33:53
【问题描述】:

我正在使用 Maven 和 Spring Boot 构建一个多模块休息服务,该服务将发布在 WebLogic Server 上,我对如何配置应用程序模块的打包有点困惑。

我目前的结构是:

/应用程序
   /main(spring-boot 的主要方法)
   /api
   /服务
   /dao

父项目(应用文件夹)设置为pom打包,但是子项目我不知道怎么配置。我相信正确的方法是像 .jar 文件一样打包,但我在互联网上看到了一些将 Maven 多模块定义为战争的 Java 项目示例。

谁能告诉我在这种情况下定义子模块打包的正确方法是什么?

我的父母 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>
  <groupId>com.radarveicular</groupId>
  <artifactId>radarveicular-application</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

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

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <javax.inject.version>1</javax.inject.version>
    </properties>

  <modules>
    <module>radarveicular-api</module>
    <module>radarveicular-service</module>
    <module>radarveicular-main</module>
    <module>radarveicular-dao</module>
  </modules>

  <build>

        <plugins>

            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                    <wtpversion>2.0</wtpversion>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>

        </plugins>

    </build>

</project>

主 pom:

<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>com.radarveicular</groupId>
    <artifactId>radarveicular-application</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>radarveicular-main</artifactId>

  <dependencies>
      <dependency>
            <groupId>com.radarveicular</groupId>
            <artifactId>radarveicular-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!-- Spring Framework -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
  </dependencies>

  <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

api pom:

<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>com.radarveicular</groupId>
        <artifactId>radarveicular-application</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>radarveicular-api</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.radarveicular</groupId>
            <artifactId>radarveicular-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

服务点:

<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>com.radarveicular</groupId>
        <artifactId>radarveicular-application</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>radarveicular-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.radarveicular</groupId>
            <artifactId>radarveicular-dao</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
    </dependencies>

</project>

dao pom:

<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>com.radarveicular</groupId>
        <artifactId>radarveicular-application</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>radarveicular-dao</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.4</version>
        </dependency>
    </dependencies>

</project>

【问题讨论】:

    标签: java spring-boot maven-3


    【解决方案1】:

    我认为您的问题是 您的父母 pom.xml 不应该处理您的 Spring Boot 项目。意思是,你应该有这个:

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

    我建议您的 pom.xml 父级仅将您的模块和依赖项作为 pom 打包处理:

    包装

    <packaging>pom</packaging>
    

    模块

    <modules>
        <module>radarveicular-api</module>
        <module>radarveicular-service</module>
        <module>radarveicular-main</module>
        <module>radarveicular-dao</module>
    </modules>
    

    然后,您的模块 radarveicular-main 将带有 spring boot 父级:

    家长

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

    包装

    <packaging>war</packaging>
    

    我希望这会对你有所帮助。 =)

    【讨论】:

    • 在这种情况下,我会在我的radarveicular-main pom中指向两个父母?雷达车辆应用程序和弹簧启动父母?
    • 您的模块不能有 2 个父模块。您的 radarveicular-main 将只有 spring-boot-parent 作为父级。然后你的parent 将使用module 打包所有项目。
    【解决方案2】:

    我觉得你的问题更多的是设计多模块的一部分。

    应用程序的多模块管理可以依赖于各种东西。

    1. 如果您想将每个子模块部署为基于单独的模块/服务,可以根据需要关闭/打开。在这种情况下,如果您将每个模块构建为单独的战争并单独部署它们,它将对您有所帮助。

    2. 如果你必须将它部署为一个单一的战争而不是最直接的方法是将所有依赖模块创建为 jar 并将它们包含在父项目中。这样一来,一场战争就会展开。

    3. 您可以采用上述两种方法的混合方法。

    希望我正确理解了您的问题。 :)

    编码愉快!!

    【讨论】:

    • 我有一个问题。按照第一个选项并单独部署每个模块,这个过程是如何工作的?我需要在本地服务器中构建相同的文件夹结构并将每个模块部署到相应的文件夹中?
    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2020-11-01
    • 2021-10-19
    相关资源
    最近更新 更多