gpt4 book ai didi

java - Eclipse Mars保存后始终无法解决导入问题,但是仅清理项目就可以解决

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:50 25 4
gpt4 key购买 nike

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

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

这比听起来要令人烦恼的多,因为构建整个工作区可能要花费几分钟,并且由于仅Project / Clean才能使所有失败的import再次工作,所以这不能归因于我们代码中的错误。

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

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

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

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

  • 初始状态:不存在任何错误(可能仅是因为我清除了所有项目),也没有未保存的更改。
  • 我在编辑器中对类进行了更改,然后保存并生成了错误。
  • 我撤消了所做的更改,保存和清理;所以我又回到了最初的状态。
  • 我重做该更改(相同),我保存了,这次我没有收到错误。

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

    1)无论生成的 .class文件有无错误(次要版本:0;主要版本:51),次要版本和主要版本始终相同。当然,当 .class文件带有错误构建时,它包含错误消息,而当构建而没有错误时,则不包含错误消息。

    2)比较两个 javap文件的 .class输出,我看到在“常量池”部分中,各行都是相同的(显示类成员和对象的名称,例如 Ljava/lang/String;),直到一行有关 my.package.MyClassImpl类的行为止,其中有问题的 .class文件具有
    #32 = Utf8 LMyClassImpl;
    正确的 .class文件具有相同但完全合格的文件:
    #32 = Utf8 Lmy.package.MyClassImpl;
    我敢肯定这与问题有关。

    添加: 如果我在Eclipse首选项Java / Compiler / Building / Output folder下的“重建由他人修改的类文件”复选框中打钩,问题将不再出现在中。至少在所有显示某些问题的情况下,该问题都不再显示。
    这只是一个解决方法,我一直在调查根本原因,但是,这强烈暗示 Eclipse’s internal Java compiler在此问题中扮演重要角色。

    添加:以下是两个项目的 .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分支或将更改拉入我的工作区时,这当然会导致那些编译错误出现, 有时 Eclipse在Java Builder中显示一个关于 NullPointerException的错误对话框,在这种情况下,它会显示确实将其写入日志(请参见下面的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。我强烈建议您使用install Buildship并将其用于将项目导入到Eclipse工作区中。它将正确设置一个与构建文件中列出的依赖项保持同步的类路径容器,并适本地协调Eclipse的编译器需要完成的工作以及Gradle本身需要完成的工作,以使它们不与之冲突。彼此。

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

    关于java - Eclipse Mars保存后始终无法解决导入问题,但是仅清理项目就可以解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33476910/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com