找不到符号 - Spring Boot Maven 兄弟作为依赖

Posted

技术标签:

【中文标题】找不到符号 - Spring Boot Maven 兄弟作为依赖【英文标题】:Cannot find symbol - Spring Boot Maven sibling as depency 【发布时间】:2019-07-17 06:32:27 【问题描述】:

使用 Maven spring boot 插件重新打包没有帮助。

    已尝试清理 .m2 文件夹。 从 sts 和命令行构建项目。 添加了组件扫描器来扫描实体,但在 maven 构建本身时失败。 添加了 Spring Boot Maven 插件以重新打包为可执行 jar 选项,似乎没有任何帮助。

父pom包含spring boot starter

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

以及以下模块

<modules>
    <module>client-data</module>
    <module>eureka-server</module>
    <module>eureka-client-service-1</module>
    <module>eureka-client-service-2</module> 
 </modules>

eureka-client-service-1eureka-client-service-2 具有 client-data 作为依赖项。

由于client-dataspring-boot 项目,包类型为jar,因此添加了以下代码以在客户端数据的uber jar 中创建uber jar

     <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

仍在执行mvn clean install -amd -e 会出现以下错误

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project eureka-client-service-1: Compilation failure: Compilation failure:
[ERROR] /C:/Users/balaji/trashcan/pcf-eureka-show-case/eureka-client-service-1/src/main/java/org/balaji/java/jee/pcf/eureka/client/service_1/boundary/EurekaClientEmployeesServiceEndpoint.java:[16,65] package org.balaji.java.jee.pcf.eureka.client.data.controller does not exist
[ERROR] /C:/Users/balaji/trashcan/pcf-eureka-show-case/eureka-client-service-1/src/main/java/org/balaji/java/jee/pcf/eureka/client/service_1/boundary/EurekaClientEmployeesServiceEndpoint.java:[17,61] package org.balaji.java.jee.pcf.eureka.client.data.entity does not exist
[ERROR] /C:/Users/balaji/trashcan/pcf-eureka-show-case/eureka-client-service-1/src/main/java/org/balaji/java/jee/pcf/eureka/client/service_1/boundary/EurekaClientEmployeesServiceEndpoint.java:[27,5] cannot find symbol
[ERROR] symbol:   class OrganizationDataFixtureAdapter
[ERROR] location: class org.balaji.java.jee.pcf.eureka.client.service_1.boundary.EurekaClientEmployeesServiceEndpoint
[ERROR] /C:/Users/balaji/trashcan/pcf-eureka-show-case/eureka-client-service-1/src/main/java/org/balaji/java/jee/pcf/eureka/client/service_1/boundary/EurekaClientEmployeesServiceEndpoint.java:[42,32] cannot find symbol
[ERROR] symbol:   class Employee
[ERROR] location: class org.balaji.java.jee.pcf.eureka.client.service_1.boundary.EurekaClientEmployeesServiceEndpoint

【问题讨论】:

模块不是依赖项。创建另一个真正将所有内容添加为依赖项并在其中隐藏所有内容的模块。你不能用parent来编译所有的东西。 Spring boot jar 用于包含完整的可运行应用程序。它不应该用作图书馆。它的内容是一个自定义类加载器和启动器以及一堆嵌入式 jar。如果你想使用一个项目 A 作为另一个项目 B 的依赖项,那么 A 不应该是一个使用 Spring Boot 插件打包的 SPring Boot 应用程序。它应该是一个普通的旧库,打包为一个普通的旧 jar。 谢谢@JB Nizet。由于这是一个多模块 maven 项目,因此行为是从父 pom 继承的,因为我使用的是 spring-boot-starter。有什么方法可以在不更改项目结构的情况下删除 spring-boot 行为。 感谢@CodeMatrix。父项目只是一个 pom 项目,子模块是深度打包的,意味着嵌套模块。 Spring Boot 启动器是一个库。我猜你说的是spring boot plugin。我不知道:我不使用 Maven。但我想我不会默认应用 Boot 插件并尝试将其删除,而是默认情况下不会应用它,而只会将其添加到实际上是 Spring Boot 应用程序的 the 项目中。跨度> 【参考方案1】:

对于“有什么方法可以在不改变项目结构的情况下移除 spring-boot 行为”的问题。

=> 您可以覆盖子 pom 文件中的 spring-boot-maven-plugin 行为。

参考这里:How to add a dependency to a Spring Boot Jar in another project?

Spring Boot 1.x

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.5.20.RELEASE</version>
    <executions>
      <execution>
        <goals>
          <goal>repackage</goal>
        </goals>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>
    ...
  </plugin>

Spring Boot 2.x 如果您使用的是 spring-boot-starter-parent,则 repackage 目标会在 id 为 repackage 的执行中自动执行。在该设置中,仅应指定配置,如下例所示:

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
      <execution>
        <id>repackage</id>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>
    ...
  </plugin> 

【讨论】:

以上是关于找不到符号 - Spring Boot Maven 兄弟作为依赖的主要内容,如果未能解决你的问题,请参考以下文章

在简单的 Maven 项目中找不到依赖 spring-boot-starter-security

Maven-在当前项目和插件组中找不到前缀“spring-boot”的插件

加入mapstruct后出现 找不到符号 符号: 方法 setXX 的解决方法

找不到 Spring Boot 2 包

Liquibase maven:spring-boot启动时找不到更改日志位置

新建spring-boot maven mybatis 工程,启动时报找不到Mapper可能的原因