这开始发生在我和我的所有队友的某个时刻,我们无法弄清楚触发了什么以及如何解决这个问题。
我们在工作区中都有相同的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
答案 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任务(替换您自己的外部工具配置)。