Maven中的“找不到符号”错误

Posted

技术标签:

【中文标题】Maven中的“找不到符号”错误【英文标题】:"cannot find symbol" error in maven 【发布时间】:2017-05-10 20:04:08 【问题描述】:

我看到很多关于 *** 的问题。但是我仍然无法知道我构建项目的方式有什么问题。

我有两个 Spring Boot 项目:we-data 和 we-web。 we-web 依赖于 we-data。 we-data 在 Maven 上编译得很好。但是 we-web 给了我以上错误。

我们的数据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.we</groupId>
    <artifactId>data</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>we-data</name>
    <description>Demo project for Spring Boot</description>

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

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

we-web 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.we</groupId>
    <artifactId>web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>we-web</name>
    <description>Demo project for Spring Boot</description>

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

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

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

        <dependency>
            <groupId>com.we</groupId>
            <artifactId>data</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

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

每次我在 we-web 上执行 maven“干净编译包安装”目标时,我都会收到 maven 错误。没有找到这个抱怨的所有符号都在 we-data 项目中。出于某种原因,它说在 we-web 中找不到所有类别的 we-data。但是当我将应用程序作为 spring boot 应用程序运行时,一切都很好。没有 maven 错误对此很重要。:

[INFO] ------------------------------------------------------------------------
[INFO] Building we-web 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ web ---
[INFO] Deleting C:\Users\user\Documents\GitHub\we\we-web\target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 10 source files to C:\Users\user\Documents\GitHub\we\we-web\target\classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /C:/Users/user/Documents/GitHub/we/we-web/src/main/java/com/we/controller/EmployeeController.java:[13,25] package com.we.service does not exist
[ERROR] /C:/Users/user/Documents/GitHub/we/we-web/src/main/java/com/we/controller/EmployeePaymentController.java:[22,9] cannot find symbol
  symbol:   class EmployeeService
  location: class com.we.controller.EmployeePaymentController
.
.
.
[INFO] 44 errors 
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.322 s
[INFO] Finished at: 2016-12-26T15:30:54+05:30
[INFO] Final Memory: 26M/253M
[INFO] ------------------------------------------------------------------------
[WARNING] The requested profile "pom.xml" could not be activated because it does not exist.
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project web: Compilation failure: Compilation failure:
.
.

我有 STS 使用的 1.8 jdk。而且我还没有将 we-data 项目放在 we-web 的构建路径上。我希望这件事过去,因为我想为此引发一场战争。请帮忙。我在 we-data 上进行“干净的编译包安装”,然后在 we-web 上进行。 “更新 maven 项目”也对我没有帮助。

【问题讨论】:

看起来包不匹配 - 请更正导入并解决此问题com.we.service does not exist。希望这应该解决构建 @ClementAmarnath:不,包的导入没问题。如果是这样的话,我就不应该让我们的网络运行起来。但它运行良好。仅当我进行 Maven 构建时才会收到错误消息。我在两个项目中都有相同的包结构。这会导致任何问题吗?更新了问题。 在这种情况下,试试这个删除we-data的.m2,构建we-data,然后we-web 不要创建 2 个 spring boot 项目。您不应该将 spring-boot 项目包含到另一个 spring boot 项目中。该 jar 不是普通的 jar,因此无法找到资源(尽管在 1.4 之前这有效,但您仍然不应该这样做)。将 we-data 设为常规 jar 而不是 spring boot jar。如果它们都是独立项目,那么一开始就不应该依赖另一个。 【参考方案1】:

每次我在 we-web 上执行 maven“干净编译包安装”目标时,我 得到 Maven 错误。没有找到所有抱怨的符号 都在we-data项目中。

1) 我认为你应该阅读关于 Maven pom here 和 lifecycle in Maven 的介绍。

mvn clean compile package install

对于编译和打包阶段是多余的,因为安装阶段包括这些阶段(. 所以,只做这个:

mvn clean install

2) 运行 maven 目标的 Web 模块需要 com.we:data:0.0.1-SNAPSHOT 依赖于您的实际代码:

    <dependency>
        <groupId>com.we</groupId>
        <artifactId>data</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

如果您添加或修改代码并且不安装此模块,则 Web 模块无法看到这些更改。

因此,您应该先在 com.we:data 模块中执行 mvn clean install,然后再在 web 模块中执行此操作。

最后,避免未更新依赖项的最简单方法是从聚合这些模块的 multi-module project 运行 mvn clean install

【讨论】:

我一直在先构建 we-data,然后再构建 we-web。但是现在,我正在执行“mvn clean install”而不是“mvn clean compile package install”(谢谢)。那是行不通的。我想按照您的建议为此创建多模块项目。但我不知道如何创建多模块“spring boot”项目(也是spring boot maven模块(如果我听起来很愚蠢,请原谅))。让我知道您是否可以帮助我,或者我应该在 *** 上提出一个新问题。 不客气。 “那不行。”拥有一个多模块项目不会在编译时解决缺少的类。它只允许有一个更健壮的构建,因为所有都是有序的。你能详细说明你的错误,编辑你的帖子并显示所有相关信息(例如缺少类的包)吗?【参考方案2】:

我也被这个问题困扰了一天,终于在这里找到了我所做的根本原因和解决方案:

如果您的 pom 上有以下几行(您的情况是 we-data 的 pom)

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

您应该删除这些行并更改为:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
</plugin>

从M. Deinum 得到线索后,我发现他是正确的,如果您使用spring-boot-maven-plugin,编译的 jar 将不是普通的 jar,无论如何感谢您提供的线索。

也请检查这个问题:Dependency not found in Spring Boot project

我试过用这个:

    <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>

它就像一个魅力。

【讨论】:

为我工作。默认情况下,Spring Boot jar 依赖项不起作用。 添加配置分类器exec 也为我修复了它。它在构建时输出两个单独的 jar:一个普通的 app.jar(与在没有此插件的情况下构建时相同)和一个新的胖 jar app-exec.jar。根据您关于胖罐子不被识别为普通罐子的解释,我猜想原来的罐子需要在场才能修复它。干杯! 我把配置放在spring-boot-maven-plugin下面,没有标签。使用您的解决方案,它会生成 3 个 jar,即 app-version.jar.original、app-version.jar 和 app-version-exec.jar。如果没有 标签,它会生成两个 jar:app-version.jar 和 app-version-exec.jar。【参考方案3】:

在pom.xml中,添加依赖

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

和你使用@Inject 的类 Import javax.inject.Inject import javax.inject.Inject;

【讨论】:

【参考方案4】:

在我的 Spring Boot 应用程序中,我在单个 ServiceFoo.java 文件中拥有以下服务和随附的非公共类:

@Service
public class ServiceFoo 

class Foo  
class Bar  

在某些时候,Maven 开始以cannot find symbol: class Service 失败。

仅在将类 Foo 和 Bar 移动到单独的 java 文件(分别为 Foo.javaBar.java)后,错误才消失。看起来像 Maven(3.5.2 和 3.6.3)或 Java(1.8.0_201)错误。

【讨论】:

【参考方案5】:

我得到了同样的错误“找不到符号”。

我前后有 2 个 maven 模块,尽管存在依赖关系,但前端模块无法访问后端模块。

问题出在后面模块中的 pom.xml 上。我删除了这些行:

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

我刚刚在前面的 pom 模块中得到了这些行。

【讨论】:

以上是关于Maven中的“找不到符号”错误的主要内容,如果未能解决你的问题,请参考以下文章

找不到符号Maven打包找不到符号的问题排查

maven install找不到找不到符号

在idea中使用maven执行 `compile` 命令编译项目,发现报错:“找不到符号“。

Maven编译时,出现找不到符号

maven 找不到或无法加载主类,找不到符号,类

Maven找不到依赖包