Maven中出现"cannot find symbol"错误

22

我在stackoverflow上看到很多关于这个问题的提问,但是我还是不知道在构建项目时我的方法有什么问题。

我有两个Spring Boot项目:we-data和we-web。we-web依赖于we-data。we-data在Maven上编译良好。但是we-web会出现以上错误。

we-data的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的“clean compile package install”目标时,都会遇到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的构建路径上。我希望能够通过这个,因为我想生成一个war文件。请帮忙。我正在对we-data执行“clean compile package install”,然后对we-web执行相同操作。 "更新maven项目"也无法帮助我。


看起来包不匹配 - 请更正导入并解决 com.we.service不存在。希望这可以解决构建问题。 - Clement Amarnath
@ClementAmarnath:不,包的导入都没问题。如果是这样的话,我就不应该能够运行we-web了。但事实上它可以正常运行。只有在我进行maven构建时才会出现错误。我的两个项目具有相同的包结构,这可能会引起什么问题吗?已更新问题。 - User1230321
在这种情况下,请尝试删除we-data的.m2文件夹,构建we-data,然后再构建we-web - Clement Amarnath
5
不要创建2个Spring Boot项目。不应该将一个Spring Boot项目包含到另一个Spring Boot项目中。这个jar不是一个普通的jar,所以资源找不到(虽然在1.4之前这样做是可以的,但仍然不应该这样做)。将we-data设置为普通jar而不是Spring Boot jar。如果它们都是独立的项目,那么首先一个不应该依赖于另一个。 - M. Deinum
5个回答

38

我也遇到了这个问题,卡了一整天,最终在这里找到了问题的根本原因和解决方案,下面是我的解决方法:

如果你在pom.xml文件中有以下几行代码(对于你的情况是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是正确的,无论如何感谢他提供的线索。

还请检查此问题:Spring Boot项目中找不到依赖项

我尝试使用以下内容:

    <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 依赖默认情况下无法工作。 - inaitgaJ
添加配置分类器 exec 对我也起到了修复作用。它在构建时输出两个独立的 JAR 包:一个普通的 app.jar(与没有使用此插件时构建的相同),以及一个新的用于生成 fat jar 的 app-exec.jar。从您的解释中,我们可以猜测 fat jar 未被识别为普通 jar,因此需要存在原始的 jar 包来进行修复。谢谢! - Babyburger
我在<artifactId>spring-boot-maven-plugin</artifactId>下面放置了以下配置,但没有<executions>标签。使用您的解决方案,它会生成3个JAR文件:app-version.jar.original、app-version.jar和app-version-exec.jar。如果没有<executions>标签,它将生成两个JAR文件:app-version.jar和app-version-exec.jar。 - Harun
放置<id>repackage</id>的重要性是什么?因为在执行标签中放置后,它对我起了作用。 - Abhilash Ramteke

4
每次我在we-web上执行maven的"clean compile package install"目标时,都会出现maven错误。所有导致错误的符号都在we-data项目中。
1)我认为你应该阅读有关Maven pom和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模块无法看到这些更改。因此,在对Web模块进行操作之前,您应该在“com.we:data”模块中执行“mvn clean install”。最后,避免出现未更新的依赖关系的最简单方法是从一个聚合这些模块的多模块项目中运行“mvn clean install”。

我先构建了we-data,然后再构建we-web。但现在,我正在执行“mvn clean install”,而不是“mvn clean compile package install”(感谢您的建议)。但这并没有起作用。我想按照您的建议创建多模块项目。但我不知道如何创建多模块的“spring boot”项目(如果我听起来很愚蠢,请原谅)。请告诉我是否可以帮助我解决这个问题,或者我应该在stackoverflow上开一个新的问题。 - User1230321
欢迎。"那不起作用。"拥有多模块项目将无法在编译时解决缺失的类。它只允许构建更强大,因为所有内容都是有序的。您能详细说明您的错误吗?编辑您的帖子并显示所有相关信息(例如缺少的类和包)吗? - davidxxx

1

在我的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)的 bug。


0
在 pom.xml 文件中,添加依赖。
<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

在使用 @Inject 的类中导入 javax.inject.Inject。import javax.inject.Inject;


0

我遇到了相同的错误 "无法找到符号"。

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接