Eclipse Mars在保存后始终无法解析导入,但仅清理项目就解决

时间:2015-11-02 11:48:56

标签: java eclipse gradle build

这开始发生在我和我的所有队友的某个时刻,我们无法弄清楚触发了什么以及如何解决这个问题。
我们在工作区中都有相同的Java项目。在Project菜单中,我们都勾选了Build automatically 让我们说我的工作区没有编译错误。我对其中一个Java类进行了一个微不足道的更改,我保存,Eclipse开始重建,结果是数百个类 - 在多个项目中 - 现在有编译错误。这是因为由于某些原因,很多import语句现在显示错误导入[xxx]无法解析
但是那些import(以及整个工作空间)在我保存完全无关的变化之前完全没有错误,并且如果此时我只是做了它们,它们都会完全没有错误Project / Clean当然会触发工作区重建。

工作区文件夹中的.log文件没有显示任何内容;如果在我保存之前它已空,那么在我保存后它仍然为空,导致出现这些错误。

这听起来比听起来更烦人,因为构建整个工作区可能需要几分钟,因为仅仅Project / Clean使所有失败的import再次工作,这不能归因于我们的代码。

我知道这是一个很长的镜头,但考虑到这个问题对我们来说是多么可重复(100%的时间在所涉及的几台计算机上100%),也许其他人有同样的问题,并发现原因或解决方案。 / p>

该版本是 Eclipse Java EE IDE for Web Developers ,Mars.1 Release(4.5.1),在Windows 8上。

我们使用Gradle(2.6)创建指向gradlew.bat并带有字符串提示的外部工具配置。我们手动运行这些项目以在将项目导入Eclipse后进行配置(通过在字符串提示符中输入eclipse)并为部署构建JAR(通过在字符串提示符中输入build),但是我不要以为Gradle参与了Eclipse的问题构建。

ADDED:我不再确定这个问题是100%可重复的,因为会发生以下情况:

  • 初始状态:没有错误(只能因为我清理了所有项目)而且没有未保存的更改。

  • 我在编辑器中更改了一个类,我保存并生成错误。

  • 我撤消了改变,保存和清理;所以我回到了初始状态。

  • 我重做那个改变(相同),我保存,这次我没有得到错误。

已添加:使用javap检查生成的.class文件,我注意到以下两点:

1)无论是.class文件是使用错误构建还是没有(次要版本:0;主要版本:51),次要版本和主要版本始终相同。当然,当使用错误构建.class文件时,它包含错误消息,而在没有错误的情况下构建它时,它不包含错误消息。

2)比较两个javap文件的.class输出,我在"常量池"中看到了部分行是相同的(显示类成员和对象的名称,f.ex。Ljava/lang/String;)直到有关my.package.MyClassImpl文件有问题的类.class的一行

#32 = Utf8 LMyClassImpl;

并且正确的.class文件具有相同但完全限定的文件:

#32 = Utf8 Lmy.package.MyClassImpl;

我确定这与问题有关。

已添加 问题消失如果勾选{{1}下的Eclipse偏好设置中的“其他人修改的重建类文件”复选框}。至少在某些变化显示问题的所有情况下都不会显示出来。 这只是一种解决方法,我一直在调查根本原因,但这暗示Eclipse’s internal Java compiler在这个问题中发挥了重要作用。

已添加:以下是两个项目的Java / Compiler / Building / Output folder.classpath个文件的内容。第一个项目是显示那些编译错误的项目。第二个项目是一个从未做过的项目。我不得不在一个文件中用.project替换多行,因为有30.000个字符限制,我似乎无法找到如何附加文件;如果这是允许的,有人指出我如何做到这一点,我将附加他们没有削减,并从问题中删除他们的内容。

请注意第一个....有一个条目.classpath而第二个没有条目的有趣区别。但是,当我修改具有通过Eclipse(项目属性/ Java构建路径/源)的所有项目的Java构建路径时,删除它们excluding="**/*.class"生成的excluded:**/*.class文件don& #39; t有这个条目,但无论如何都会出现编译错误(也是在重启Eclipse之后)。如果我做相反的事情(即将.classpath添加到所有没有它的项目中),那么所有项目的excluded:**/*.class文件都会获得该条目,但编译错误仍会显示。我敢打赌,这可以解决问题,但事实并非如此。

.classpath MyProjectThatGetsErrors档案:

.project

<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>MyProjectThatGetsErrors</name> <comment/> <projects/> <natures> <nature>org.eclipse.jdt.core.javanature</nature> </natures> <buildSpec> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments/> </buildCommand> </buildSpec> <linkedResources/> </projectDescription> MyProjectThatGetsErrors档案:

.classpath

<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry excluding="**/*.class" kind="src" path="src/main/java"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="src" path="/MyUtilsProject1"/> <classpathentry kind="src" path="/MyUtilsProject2"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/org.eclipse.jetty/jetty-io/8.1.15.v20140411/8849cf59187275366cd05f37b2fb71319291370b/jetty-io-8.1.15.v20140411.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/org.eclipse.jetty/jetty-io/8.1.15.v20140411/49fd78caf4ca0c7cdbc532fc48ff46183bb8fb62/jetty-io-8.1.15.v20140411-sources.jar"/> .... .... <classpathentry kind="lib" path="D:/EclipseMars/git/MyProjectThatGetsErrors/lib/tapestry5-highcharts-1.2.0.jar"/> <classpathentry kind="output" path="bin"/> </classpath> MyUtilsProject1档案:

.project

<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>MyUtilsProject1</name> <comment/> <projects/> <natures> <nature>org.eclipse.jdt.core.javanature</nature> </natures> <buildSpec> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments/> </buildCommand> </buildSpec> <linkedResources/> </projectDescription> MyUtilsProject1档案:

.classpath

已添加:当我切换到其他Git分支或将更改拉入我的工作区时,这当然会导致出现这些编译错误, 有时会 Eclipse在Java Builder中显示关于<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src/main/java"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-digester/commons-digester/1.8/dc6a73fdbd1fa3f0944e8497c6c872fa21dca37e/commons-digester-1.8.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-digester/commons-digester/1.8/6c296de7dc352e0af9a40f92f5af995314d41fc9/commons-digester-1.8-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.3.2/90a3822c38ec8c996e84c16a3477ef632cbc87a3/commons-lang3-3.3.2.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.3.2/d2a489573c0ed2c4942b3660decad5d65087b406/commons-lang3-3.3.2-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-configuration/commons-configuration/1.6/32cadde23955d7681b0d94a2715846d20b425235/commons-configuration-1.6.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-configuration/commons-configuration/1.6/2d24067548bf9022d03cfd6ca302e1f6c5d4936/commons-configuration-1.6-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-fileupload/commons-fileupload/1.2/a10c06183fe21f3bb3dda3b5946b93db6e2ad5cc/commons-fileupload-1.2.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-fileupload/commons-fileupload/1.2/c7859b375ae5bc1b4a4f2b91ce6d1d387e676e61/commons-fileupload-1.2-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-beanutils/commons-beanutils-core/1.8.0/175dc721f87e4bc5cc0573f990e28c3cf9117508/commons-beanutils-core-1.8.0.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/org.apache.velocity/velocity/1.7/2ceb567b8f3f21118ecdec129fe1271dbc09aa7a/velocity-1.7.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/org.apache.velocity/velocity/1.7/eb11eb70171ed64842b2e5216d5904e21ed162ac/velocity-1.7-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-collections/commons-collections/3.2.1/761ea405b9b37ced573d2df0d1e3a4e0f9edc668/commons-collections-3.2.1.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-collections/commons-collections/3.2.1/fa095ef874374e5b2a11f8b06c26a5d68c7cb3a4/commons-collections-3.2.1-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-beanutils/commons-beanutils/1.7.0/5675fd96b29656504b86029551973d60fb41339b/commons-beanutils-1.7.0.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-beanutils/commons-beanutils/1.7.0/b68c4fc66026e8c08df7fb57c7dc1e94a6ed8cbb/commons-beanutils-1.7.0-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.4/16313e02a793435009f1e458fa4af5d879f6fb11/commons-lang-2.4.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.4/2b8c4b3035e45520ef42033e823c7d33e4b4402c/commons-lang-2.4-sources.jar"/> <classpathentry kind="lib" path="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/5043bfebc3db072ed80fbd362e7caf00e885d8ae/commons-logging-1.1.1.jar" sourcepath="C:/Users/Me/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.1.1/f3f156cbff0e0fb0d64bfce31a352cce4a33bc19/commons-logging-1.1.1-sources.jar"/> <classpathentry kind="lib" path="D:/EclipseMars/git/MyUtilsProject1/lib/MyCompany cayenne-client-3.0.2.jar"/> <classpathentry kind="output" path="bin"/> </classpath> 的错误对话框,在这种情况下,它会将其写入日志中(请参阅下面的stacktrace)。但是,当这些错误出现时,99%的时间都没有这样的空指针。

NullPointerException

1 个答案:

答案 0 :(得分:3)

我怀疑你问题的根源是因为你正在尝试使用Gradle告诉Eclipse Eclipse应该如何配置你的项目。 Gradle(或Maven)与Eclipse之间存在一些冲突;不幸的是,Gradle(和Maven)团队已经推出了构建工具适合生成IDE配置的想法,而事实上他们并不是很擅长。 IDE(以及使用它的开发人员)应负责创建和管理其项目配置文件。

Eclipse具有Gradle工具,您可以根据其中的build.gradle文件安装并确切知道如何正确配置和维护Eclipse项目。它被称为Buildship。我强烈建议您install Buildship并使用它将项目导入Eclipse工作区。它将正确设置一个Classpath容器,它与构建文件中列出的依赖项保持同步,并正确协调Eclipse编译器需要完成的工作以及Gradle本身需要完成的工作,以便他们能够#39; t彼此冲突。

它还提供了一个很好的Gradle任务视图,您可以使用它从Eclipse中轻松调用Gradle任务(替换您自己的外部工具配置)。