Maven "cannot find symbol"信息不够明确

98

这是一个非常简单的问题,可能是某个我不知道的设置,但是谷歌在回答这个问题方面并不是很有帮助,给出的结果都是关于编译错误而不是如何更改编译错误消息的。

当我用maven构建我的项目时,它会给我格式大致如下的错误消息:

[ERROR] /path/to/source/Main.java:[13,8] error:无法找到符号

当我使用ant或javac构建时,实际上会在错误消息中告诉我无法找到的符号。 Maven给出了行号和字符位置,但显示实际符号会更有帮助。 上面的行是每个“无法找到符号”错误的唯一行。 没有上面或下面的行提供符号。 我想必须有一种方法可以让maven告诉我这些信息,但我不知道是什么。 我尝试了-e选项,因为mvn告诉我要尝试使用它,但它给出了一个maven回溯,而不是实际的符号。

有什么帮助吗?

这里是mvn --version的输出:

Apache Maven 3.0.4 (rNON-CANONICAL_2012-10-24_11-25_mockbuild; 2012-10-24 07:25:04-0400)
Maven home: /usr/share/maven
Java version: 1.7.0_09-icedtea, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.6.6-1.fc17.x86_64", arch: "amd64", family: "unix"

以下是 Maven 输出的一个(不太有用的)错误信息示例(只是将目录缩短了):

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /path/to/source/SoundEngineFilePanel.java:[33,8] error: cannot find symbol
[ERROR]  class SoundEngineFilePanel
/path/to/source/SoundEngineFilePanel.java:[36,8] error: cannot find symbol
[INFO] 2 errors 
[INFO] -------------------------------------------------------------
它找不到的符号是"fakeThing"和"fakeThing2",而不是SoundEngineFilePanel。

它找不到的符号是"fakeThing"和"fakeThing2",而不是SoundEngineFilePanel。


你能提供一些版本信息吗(特别是Maven)等等?这对我来说不是发生的情况。 - Dave Newton
确实,Maven的“找不到符号”信息并不是很有用。我可以告诉你我的情况,我的代码长期使用第三方库的特定方法,但某种方式该方法已从第三方库中删除。当Maven编译代码时,它会失败。如果消息是“找不到方法”而不是“找不到符号”,那么它将非常有效且节省时间。 - Atul S.
1
对于那些想要在此问题中添加另一个答案的人,请仔细阅读问题。它不是关于如何修复(Maven中的)“找不到符号”编译错误的问题,而是关于如何让Maven提供更多信息的编译错误消息;即包括源代码上下文的消息...像javacAnt一样。 - Stephen C
17个回答

39

更新至 3.1 版本:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.7</source>
        <target>1.7</target>
    </configuration>
</plugin>

最好的方法是确定此插件的最新版本是什么?我能找到的只有这个页面:http://maven.apache.org/plugins/maven-compiler-plugin/source-repository.html 谢谢。 - Jared Beck
@JaredBeck 看起来你可以在这里找到它:https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-compiler-plugin - DSimon

39

这是Maven编译插件中的bug,我认为与JDK7有关。使用JDK6正常。


5
似乎已经在maven-compiler-plugin 3.1中得到修复。请参考george-papatheodorou的回答。 - Jared Beck
54
这不是解决方案... 在Java 8中仍然出现编译错误。 - Eta
当Windows 10崩溃时开始出现这种情况。那可能是一个因素吗? - TheRealChx101
2
对于@Eta(以及其他27个+1的人)-我认为你们没有理解重点。这个问题是关于Maven提供的无用信息。这个答案讲述了如何使编译错误信息更有帮助性,但它并没有解决导致编译错误的问题。这个问题通常出现在你的源代码中!请参见“Cannot find symbol”或“Cannot resolve symbol”错误是什么意思? - Stephen C

12

在我的情况下,问题出现在一个子jar包中,由于我添加了一个新类,这个子jar包没有被重新构建,它的pom.xml与我的失败的pom.xml没有父子关系(使用<parent>标签)。因此,我重新构建了子jar包,之后错误消失了。


这也是我的问题。虽然Maven中肯定存在着一些bug,但我认为在大多数情况下,Maven的错误或构建问题都可以通过这样的场景来解释。 - Michael M

6
在我的情况下,我使用的是<scope>test</scope>作为依赖范围。这使得该类在开发时可用,但在编译时,我会收到以下信息。
将类的范围更改为<scope>provided</scope>解决了这个问题。

6
我遇到了同样的问题。原因是我没有通过Maven依赖添加两个JAR文件,因此当我运行mvn compile时,控制台显示错误:

无法找到符号,类...

要解决此问题:

  1. 从构建路径中删除这些JAR文件
  2. 将它们添加到构建路径
  3. 运行mvn compile

6
请列出您用来从构建路径中删除JAR文件的步骤。因为当我尝试删除目标文件夹并使用Maven重新编译时,我遇到了相同的错误。谢谢。 - turnip424

3
这是因为存在重打包(repackaging)的问题,即您在 POM 文件中定义了的问题。
请在 Maven 插件下的 pom 文件中将其删除。这样就可以解决问题了。
<executions>
    <execution>
        <goals>
             <goal>repackage</goal>
        </goals>
    </execution>
</executions>

2
即使我使用的是Java 7和maven 2.2.1,也遇到了同样的错误。我从我的pom中删除了<scope>tests</scope>并使用mvn clean -DskipTests=true install成功构建了我的项目,而不需要升级maven版本。请注意保留HTML标签。

"mvn clean -DskipTests=true" install 是一个神奇的命令!感谢分享。 (顺便说一句,我没有触及我的<scope>tests</scope>) - Eta

2

如果你的工作空间中依赖了其他项目,而这些项目没有正确地构建,那么可能会出现此类错误。 尝试首先构建这些依赖项目,这可能会有所帮助。


1
如果您使用的是Intellij,而上述解决方案无法解决问题,请尝试: 文件>无效缓存/重新启动。
对我有用。 有时候,当您在多个分支中工作时,IDE使用其缓存,并且无法在缓存中找到文件,因此在编译期间显示错误。

0
解决方案:在构建组件之前(使用mvn clean install),先构建整个项目,然后再构建您的组件。
为什么这样做: 我经常遇到这个错误。 大多数情况下,我会尝试单独构建我的组件(因为我没有在其他地方进行更改)。
是的,但最近下载的那个额外的jar文件可能受到第三方(在他们的组件内部)所做更改的影响。在整个项目上进行完整的mvn clean install已经帮了我很多次。

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