在多模块项目中找不到工件

Posted

技术标签:

【中文标题】在多模块项目中找不到工件【英文标题】:Could not find artifact in a multi-module project 【发布时间】:2017-04-27 14:52:53 【问题描述】:

所以基本上,我有一个多模块项目,例如

- ProjectA
  |- Module1
  |- Module2

ProjectA 的相关部分(我相信)pom.xml 是:

<modelVersion>4.0.0</modelVersion>
<groupId>com.companyName</groupId>
<artifactId>ProjectA</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
</parent>

<modules>
    <module>Module1</module>
    <module>Module2</module>
</modules>

Module1 的 pom.xml 是:

<parent>
    <groupId>com.companyName</groupId>
    <artifactId>ProjectA</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<artifactId>Module1</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>

而依赖于Module1的Module2的pom.xml如下:

<parent>
    <groupId>com.companyName</groupId>
    <artifactId>ProjectA</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Module2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
    <dependency>
        <groupId>com.companyName</groupId>
        <artifactId>Module1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    ...
</dependencies>

我可以很好地构建和安装 Module1。我可以在 Module2 中从中导入类,但我无法编译 Module2:Could not find artifact com.companyName:ProjectA:pom:0.0.1-SNAPSHOT

以同样的方式,我正在构建另一个项目,ProjectB,它将包含 Module3。在 Module3 pom.xml:

<dependency>
    <groupId>com.companyName.ProjectA</groupId>
    <artifactId>Module1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

但是,我无法将它导入到我的 .java 文件中,因为 com.companyName.ProjectA 不可用,IntelliJ 警告我。我究竟做错了什么?我已经尝试了相关多模块项目问题中的几乎所有配置。谢谢!

更新:控制台输出已更改为:

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /Users/user/workspace/project-name/Module2/src/main/java/com/companyName/ProjectA/Module2/users/UsersDAO.java:[3,39] package com.companyName.ProjectA.Module1 does not exist
[ERROR] /Users/user/workspace/project-name/Module2/src/main/java/com/companyName/ProjectA/Module2/users/UsersDAO.java:[9,6] cannot find symbol...

更新: 有趣的是,删除:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

来自父项目 (ProjectA) 使项目再次可构建。但是,我需要它(出于明显的原因)是否有解决方法?谢谢!

【问题讨论】:

在构建Module1 之后,您确认~/.m2/repository 中的存在了吗? @nullpointer 是的,我可以将其显示为另一个项目的依赖项,例如 ProjectB,但我无法将其导入我的 .java 文件中的 Module3ProjectB 你是什么意思将其显示为依赖项?听起来有点像,你总是可以写一段代码,但除非你编译它,否则你不会知道它有什么问题。 对不起,应该更清楚。我可以将它写入pom.xml,而无需 IntelliJ 对我大喊大叫(将其标记为红色等),但是我不能使用 import 从中类。 我 100% 确定文件就在那儿。我马上用完整的控制台输出更新我的问题。 【参考方案1】:

两个(或所有)项目都是 Spring Boot 项目。这不是常规的 jar,而是具有不同结构的可执行 jar。您不应该在另一个 Spring Boot jar 中包含 Spring Boot jar。

参考指南中的section 解释了如何处理这个问题。

基本上,您需要为 Module1

显式配置 2 个工件
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

或者如果 Module1 甚至不是可执行应用程序而只是一个库,请不要为此使用 Spring Boot Maven 插件。

【讨论】:

以上是关于在多模块项目中找不到工件的主要内容,如果未能解决你的问题,请参考以下文章

Flyway 在 Maven 多模块项目中找不到迁移

在多模块 SDK Android 库项目中配置 proguard

为啥我的 maven 模块在项目中找不到另一个模块? [复制]

如何在多模块项目中配置 Flutter 模块

在多模块 Maven 项目中更新模块的版本号

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?