Java:未解决的编译问题


76

“ java.lang.Error:未解决的编译问题”的可能原因是什么?

附加信息:

从现有JAR顶部的版本复制一组更新的JAR文件并重新启动应用程序后,我已经看到了这一点。JAR是使用Maven构建过程构建的。

如果接口更改,我希望看到LinkageErrors或ClassNotFound错误。上面的错误提示存在一些较低级别的问题。

彻底的重建和重新部署解决了该问题。此错误是否表明JAR已损坏?

java 

您做了什么导致此错误?
Greg Hewgill

我通过重命名输入参数而不是在方法中重命名该参数的所有出现而导致此错误。有趣的mvn compile是不会导致错误,但是运行程序会导致错误。mvn clean compile显示编译期间的错误(按预期方式)。
peschü

Answers:


67

(重写2015-07-28)

编译带有错误的代码时,Eclipse的默认行为是生成抛出您看到的异常的字节码,从而允许程序运行。这是可能的,因为Eclipse使用其自己的内置编译器,而不是javacApache Maven使用的JDK,并且由于错误而完全使编译失败。如果在同时使用命令行mvn命令的Maven项目上使用Eclipse ,则可能会发生这种情况。

解决的办法是修复错误并重新编译,然后再次运行。

该设置在此屏幕转储中用红色框标记:

OS X下的Eclipse首选项


那不是我的情况。将JAR文件(使用Maven构建)部署到服务器后,我看到了这一点。

1
也许您的Maven构建配置存在问题,并且它正在使用eclipse输出目录中的.class文件。无论如何,我唯一见过的错误是运行带有Eclipse中编译错误的代码时。
Michael Borgwardt

在这种情况下,您的Maven构建很可能已损坏。在Eclipse关闭的情况下,尝试从命令行进行清理和重新编译。
托尔比约恩Ravn的安徒生

没看到您编辑了问题。我将重新调查Maven的构建过程,因为它似乎并不完全干净。它应该不能创建残破的罐子!您有构建服务器吗?
托尔比约恩Ravn的安徒生

我只是有同样的问题。正如Michael所说,这似乎是Maven拾取了Eclipse生成的类文件。
Wouter Coekaerts,2009年


9

你只是尝试通过命令清理Maven

mvn clean

然后执行以下命令

mvn eclipse:clean eclipse:eclipse

并重建您的项目。


考虑到m2e Eclipse插件的当前质量(2015年),我建议使用带有Eclipse的Eclipse,而不是各种Eclipse Maven目标。
托尔比约恩Ravn的安徒生

8

您的编译后的类可能需要使用新的jar从源头重新编译。

尝试运行“ MVN清洁”,然后重建


2

大部分由ThorbjørnRavn Andersen正确回答。

这个答案试图阐明剩下的问题:有错误的类文件怎么会在jar中结束?

每个版本(mvn&javac或eclipse)在遇到编译错误时都会以其特定方式发出信号,并且会拒绝从中创建Jar文件(或至少会明显提醒您)。默默地将带有错误的类文件放入jar的最可能原因是Maven和Eclipse的并发操作。

如果在运行mvn构建时已打开Eclipse,则应禁用“ 项目” >“自动构建”,直到mvn完成。

编辑:让我们尝试将谜语分为三个部分:

(1)“ java.lang.Error:未解决的编译问题”的含义是什么

ThorbjørnRavn Andersen对此进行了解释。毫无疑问,Eclipse在编译时发现了错误。

(2)如何将经过eclipse编译的类文件最终存储到由maven创建的jar文件中(假设将maven配置为使用ecj进行编译)?

可以通过不进行清洗或不完全清洗来调用Maven。或者,自动Eclipse构建可以对文件系统中的更改做出反应(由maven完成)并重新编译类,然后maven继续将类文件收集到jar中(这就是我最初回答中的“并行操作”的意思))。

(3)为什么会有一个编译错误,但是mvn clean成功了?

再次有几种可能性:(a)编译器不同意源代码是否合法,或者(b)Eclipse使用诸如不完整的类路径,错误的Java合规性等损坏的设置进行编译。应该浮出水面。


我认为这不是一个并发问题,因为它非常系统化并且经常发生。我认为以某种方式在JVM真正使用加载时按需编译代码。不知道为什么这是可能的。我认为,编译时检查是使Java对Python的优势的东西......
peschü

1

当我使用具有无效类路径的启动配置时出现此错误。就我而言,我有一个最初使用Maven的项目,因此启动配置中包含Maven类路径元素。后来我将项目更改为使用Gradle,并从项目的类路径中删除了Maven类路径,但是启动配置仍使用它。我在尝试运行该错误。清理和重建项目无法解决此错误。而是编辑启动配置,删除项目的classpath元素,然后将项目重新添加到类路径中的“用户条目”中。


0

我多次遇到此错误,并努力解决。最后,我删除了运行配置,然后重新添加了默认条目。它工作得很漂亮。


好吧,是的……但是按照公认的答案所说的做起来会更快。它只是首选项中的一个标志。
斯蒂芬·C

-2

确保已从构建路径中删除了不可用的库(jar文件)


说“修复导致错误的编译错误”会更简单。有许多可能的原因导致编译/生成错误。我们不需要枚举它们。
斯蒂芬·C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.