Maven - 添加一个 Maven 模块作为对其他 Maven 模块的依赖

Maven - Add a maven module as dependency to other maven module

我有 2 个 Spring 启动 maven 项目(模块 A、模块 B)。它们都作为模块添加到 parent 项目中。这两个模块都有一些共同的依赖关系和 java 类(域 objects),所以我创建了第三个模块模块 C,并将所有共同的 java 文件和依赖关系放在那里。

我将模块 C 添加到 parent pom 作为模块之一。并将模块 C 添加为模块 A 和模块 B 的依赖项。在模块 A 中,无论模块 C 的 类 在哪里被引用,B 都已解决并指向模块 C 类(在 ctrl+click 上).Eclipse 中没有显示错误,并且更新了 Maven 依赖项。但是,当我从 Parent pom 或单独构建模块 A(在构建模块 c 之后)构建项目时,我在引用模块 C 类 的地方出现 cannot find symbol 错误。

下面是我pom.xml的

Parent pom.xml

<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>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.services</groupId>
    <artifactId>cloud-services</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>ModuleC</module> <!-- Project where common dependencies and Common java classes are placed -->
        <module>ModuleA</module>
        <module>ModuleB</module>
    </modules>
</project>

模块 C 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>com.example.services</groupId>
    <artifactId>cloud-services</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>ModuleC</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>ModuleC</name>
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    </dependencyManagement>
</project>

模块 A Pom.xml - 模块 C 的依赖项目

<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.example.services</groupId>
        <artifactId>cloud-services</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>ModuleA</artifactId>
    <dependencies>
    <!-- Project where common dependencies and Common java classes are placed -->
        <dependency>
            <groupId>com.example.services</groupId>
            <artifactId>ModuleC</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

模块 B Pom.xml

Same as ModuleA.

我的配置有什么问题。任何帮助深表感谢。谢谢。

我猜 spring-boot-starter-parent 是罪魁祸首。

通过将它用作父 POM 的父 POM,您可以使用它构建所有模块。 AFAIK,使用 spring-boot-starter-parent 构建的 jars 不能用作依赖项,因为 类 被移动到 jar 中的不同目录。

由于我不是 Spring 专家,因此我无法真正为您提供好的解决方案。

如果它是一个 spring 项目,jar 的根文件夹将是 BOOT-INF。

如果您创建一个普通的项目 jar,它不会有 BOOT-INF。

它的工作方式是如果你有一个项目 A 并且它依赖于 x.jar

假设项目 A 需要 x.jar 中的 com.x.y.ClassA.class 它将使用此路径 x/y/ClassA.class.[=10 在 x.jar 的根文件夹中搜索=]

在你的情况下,因为它是一个 spring 项目,决议没有奏效,它正在抱怨。