0

我在同一个目录中有两个项目,比如说 A 和dirB。B 是其模块 C 的父项目。C 依赖于 A。目录结构:

dir/
    A/
    B/
       C/

我使用这种方法创建一个带有模块的项目并显示 C 依赖于 A。这样做之后,Netbeans 开始在 C 中看到 A 的包,例如它显示没有丢失的包,提示在 C 中使用来自 A 的类.如果我把A作为B的一个模块,mvn clean install说maven reactor找到了正确的编译项目顺序,并按照A、B、C的顺序编译。mvn dependency:tree说明groupB:C:jar:0.0.1有一个子节点groupA:A:jar:0.0.1:compile

我不确定 A 是否可以成为 B 的模块,因为 A 有另一个父级(Spring boot)。因此,我尝试了另一种变体:从 B 的模块中删除 A,然后mvn clean install在 A 中,以便(我猜)它产生的 jar 进入本地 repo。这两种变体对于 maven 和 Netbeans 似乎都可以,但对于编译器则不行。在编译过程中,C 看不到 A 的包。

mvn clean install在这三个项目中的任何一个中都做过。C 中的依赖项必须具有 A 的确切属性,否则在 Maven 中会产生依赖项错误。似乎Netbeans的提示机制和Maven都认为A是C的库。只是编译器没有看到。我想我犯了一个新手错误。会是什么?

相关片段pom.xml

A:

   <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.1</version>
            <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>groupA</groupId>
    <artifactId>A</artifactId>
    <packaging>jar</packaging>
    <version>0.0.1</version>
    <name>projectA</name>
    <description>project A</description>

B:(我尝试了 A 是 B 的模块的变体,是否被注释掉)

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/>
</parent>
<groupId>groupB</groupId>
<artifactId>B</artifactId>
<packaging>pom</packaging>
<version>0.0.1</version>
<name>projectB</name>
<description>project B</description>

<modules>
        <!--module>../A</module-->
        <module>C</module>
</modules>

C:

<parent>
        <groupId>groupB</groupId>
        <artifactId>B</artifactId>
        <version>0.0.1</version>
        <relativePath>../</relativePath>
</parent>
<groupId>groupB</groupId>
<artifactId>C</artifactId>
        <packaging>jar</packaging>
<version>0.0.1</version>
<name>projectC</name>
<description>project C</description>
<dependencies>
        <dependency>
            <groupId>groupA</groupId>
            <artifactId>A</artifactId>
            <version>0.0.1</version>
        </dependency>
</dependencies>
4

1 回答 1

0

看到 A 的 jar 在依赖树中,我在那个 jar 中搜索了 A 的类。原来,没有。相反,它们单独包装在groupA.A.jar.original. 事实证明,让 Spring Boot 成为 A 的父级是可以的,即使 A 只是一个库。多亏了这一点,所有 Spring 依赖项都会自动从父级获取版本。但是,我也包含spring-boot-maven-plugin在A中,不知道它是做什么用的。该插件的repackage目标是准备一个 Spring Boot 应用程序。这是创建这两个罐子的原因,实际上,C 看不到 A 的类。有关更多详细信息,请参阅此问题

将 Spring Boot 保留为父级但删除插件使 C 看到 A 的类。

于 2021-01-26T10:11:10.670 回答