草庐IT

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

coder 2024-04-01 原文

我和我的所有队友都开始在某种程度上发生这种情况,我们无法弄清楚是什么触发了这种情况以及如何解决这一问题。
我们的工作区中都有相同的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/

    有关java - Eclipse Mars保存后始终无法解决导入问题,但是仅清理项目就可以解决的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

      我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

    3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    4. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

      为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

    5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

      查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

    6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

      我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

    7. ruby - 无法运行 Rails 2.x 应用程序 - 2

      我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

    8. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

      我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

    9. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

      我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

    10. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

      我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

    随机推荐