Eclipse Mars保存后始终无法解决导入问题,但仅清理项目即可解决

SantiBailors

我和我的所有队友都开始在某种程度上发生这种情况,我们无法弄清楚是什么触发了这种情况以及如何解决该问题。
我们的工作区中都有相同的Java项目。Project菜单中,我们所有人都已Build automatically勾选。
假设我的工作空间没有编译错误。我对其中一个Java类进行了微不足道的更改,我保存了,Eclipse开始重建,结果是在一个以上的项目中,数百个类现在出现编译错误。这是因为由于某些原因,import现在很多语句都显示错误import [xxx]无法解析
但是那些import在保存我无关紧要的琐碎更改之前,s(以及整个工作空间)是完全没有错误的,并且如果我现在这样做Project / Clean是触发了工作空间的重建,那么它们都将恢复为完全没有错误。

.log工作区中的文件夹不显示任何文件; 如果在保存之前为空,则在保存导致这些错误出现后仍为空。

这比听起来要令人讨厌的多,因为构建整个工作区可能要花费几分钟,并且由于仅Project / Clean使所有失败import的工作重新进行,所以这不可能是由于我们的代码中的错误所致。

我知道这是一个漫长的过程,但是考虑到此问题对我们来说可重复性好(涉及的几台计算机中100%的100%的时间),也许其他人遇到了同样的问题并找到了原因或解决方案。

版本是Windows 8上针对Web开发人员的Eclipse Java EE IDE(Mars.1版本(4.5.1))。

我们通过创建指向gradlew.bat并带有字符串提示的外部工具配置来使用Gradle(2.6)在将项目导入Eclipse后(通过输入eclipse字符串提示),我们手动运行它们以配置项目,并通过输入字符串提示来构建用于部署的JAR(通过输入build字符串提示),但是我不认为Gradle涉及到问题所在由Eclipse构建。

添加:我不再确定此问题是100%可重现的说法是正确的,因为会发生以下情况:

  • 初始状态:不存在错误(可能仅是因为我清理了所有项目),也没有未保存的更改。

  • 我在编辑器中对类进行了更改,然后保存并生成了错误。

  • 我撤消所做的更改,保存并清理;所以我又回到了最初的状态。

  • 我重做该更改(相同),我保存了,这次我没有收到错误。

新增:使用javap检查生成的.class文件,我注意到2件以下的事情:

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;

我敢肯定这与问题有关。

添加: 如果我在Eclipse首选项下的“重建由其他人修改的类文件”复选框中打勾,则问题消失至少在某些更改显示问题的情况下,该问题不再显示。这只是一个解决方法,我一直在调查根本原因,但是,这强烈暗示着Eclipse的内部Java编译器在此问题中起着重要作用。Java / Compiler / Building / Output folder

添加:以下是两个项目.classpath.project文件的内容第一个项目是显示那些编译错误的项目。第二个项目是从来没有做过的。....由于30.000个字符的限制,我不得不在一个文件中替换多行,而且我似乎找不到能够附加文件的方法。如果允许的话,有人指出我该怎么做,我将不加任何裁切地附加它们,并从问题中删除其内容。

请注意第一个.classpath有一个条目excluding="**/*.class",第二个没有一个有趣的区别但是,当我通过Eclipse修改所有具有Eclipse的项目的Java Build Path(项目属性/ Java Build Path /源代码)时,删除其excluded:**/*.class生成的.classpath文件并没有该条目,但是无论如何都会出现编译错误(也在重新启动Eclipse之后) 。如果我做相反的事情(即添加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文件:

<?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>

添加:当我切换到另一个Git分支或将更改拉入我的工作空间时,这当然会导致那些编译错误出现,有时EclipseNullPointerException在Java Builder中显示一个关于a的错误对话框,在这种情况下,它确实将其写在日志(请参见下面的stacktrace)。但是,在99%的时间出现这些错误时,没有这样的空指针。

!ENTRY org.eclipse.core.resources 4 75 2015-11-10 13:51:31.544
!MESSAGE Errors occurred during the build.
!SUBENTRY 1 org.eclipse.jdt.core 4 75 2015-11-10 13:51:31.544
!MESSAGE Errors running builder 'Java Builder' on project 'MyProject'.
!STACK 0
java.lang.NullPointerException
    at org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding$2.compare(ReferenceBinding.java:92)
    at org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding$2.compare(ReferenceBinding.java:1)
    at java.util.TimSort.binarySort(TimSort.java:265)
    at java.util.TimSort.sort(TimSort.java:208)
    at java.util.Arrays.sort(Arrays.java:727)
    at org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.sortFields(ReferenceBinding.java:217)
    at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.fields(BinaryTypeBinding.java:946)
    at org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding.fields(ParameterizedTypeBinding.java:458)
    at org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding.getField(ParameterizedTypeBinding.java:643)
    at org.eclipse.jdt.internal.compiler.lookup.Scope.findField(Scope.java:1371)
    at org.eclipse.jdt.internal.compiler.ast.FieldDeclaration.resolve(FieldDeclaration.java:194)
    at org.eclipse.jdt.internal.compiler.lookup.FieldBinding.constant(FieldBinding.java:215)
    at org.eclipse.jdt.internal.compiler.lookup.FieldBinding.constant(FieldBinding.java:240)
    at org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference.getOtherFieldBindings(QualifiedNameReference.java:729)
    at org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference.resolveType(QualifiedNameReference.java:1079)
    at org.eclipse.jdt.internal.compiler.ast.ReturnStatement.resolve(ReturnStatement.java:341)
    at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:641)
    at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:309)
    at org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:551)
    at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1188)
    at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1301)
    at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:590)
    at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:861)
    at org.eclipse.jdt.internal.compiler.ProcessTaskManager.run(ProcessTaskManager.java:141)
    at java.lang.Thread.run(Thread.java:744)
电子饭

我怀疑问题的根源是由于您试图使用Gradle告诉Eclipse Eclipse应该如何配置您的项目。Gradle(或Maven)和Eclipse之间存在一些冲突。不幸的是,Gradle(和Maven)团队提出了这样的想法,即构建工具非常适合生成IDE配置,而事实上他们并不是很擅长。IDE(和使用它的开发人员)应负责创建和管理其项目配置文件。

Eclipse具有您可以安装的Gradle工具,并且确切地知道如何根据其中的build.gradle文件正确地配置和维护Eclipse项目。这称为Buildship我强烈建议您安装Buildship并将其用于将项目导入Eclipse工作区。它将正确设置一个与构建文件中列出的依赖项保持同步的类路径容器,并适当地协调Eclipse的编译器需要完成的工作以及Gradle本身需要完成的工作,以免与它们冲突彼此。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章