标签: eclipse-jdt

Eclipse Helios忽略了断点

Eclipse现在让我疯了.这可能是微不足道的,但我只是不明白.每当我想添加断点时,常规图标都会在编辑器和断点视图中划掉.这是一个截图:

断点http://j.mp/aLcYFJ

正如您可能已经猜到的,这不是严格意义上的图形问题;)在调试时会忽略断点.断点的属性也没有帮助.

任何提示都非常感谢!

编辑:

  • 我测试了不同的JDK但没有成功.
  • 我已成功调试另一个工作区中的项目

好的,所以它不是关于JDK或已安装的插件.似乎与工作区相关.我能尝试什么吗?

java eclipse debugging eclipse-jdt helios

14
推荐指数
1
解决办法
2857
查看次数

如何为自定义Java标记添加Eclipse Quick Fix?

我想将Eclipse文件的自定义问题报告给Eclipse的Problems View,并为它们提供快速修复.

标准方法是使用扩展点org.eclipse.core.resources.markers声明自定义标记并通过调用添加标记org.eclipse.core.resources.IResource.createMarker(String).然后,可以使用扩展点org.eclipse.ui.ide.markerResolution为自定义标记提供快速修复.

上述方法是一种与语言无关的创建和解析资源标记的方法.缺点是我必须编写一些样板代码来解决我的自定义Java问题.相反,我想重用IQuickFixProcessor.也就是说,我想使用扩展点解析我的自定义Java标记org.eclipse.jdt.ui.quickFixProcessors.使用此扩展点,我不再需要解析找到标记的Java文件,我不必构建绑定并找到覆盖标记的AST节点.如果我不重用org.eclipse.jdt.internal.ui.text.correction.CorrectionMarkerResolutionGenerator它及其依赖项,我最终会复制它的大部分内容.

如何使用JDT基础结构为我的自定义Java标记提供快速修复?

尝试1:

我将自定义标记定义如下:

<extension
  id="custom.marker"
  name="Custom Java Problem"
  point="org.eclipse.core.resources.markers">
    <super type="org.eclipse.jdt.core.problem"/>
    <super type="org.eclipse.core.resources.problemmarker"/>
    <super type="org.eclipse.core.resources.textmarker"/>
    <persistent value="true"/>
</extension>
Run Code Online (Sandbox Code Playgroud)

然后,我通过调用方法添加了上述标记的实例IResource.createMarker("custom.marker").

接下来,我定义了一个自定义Quick Fix处理器.

<extension
  point="org.eclipse.jdt.ui.quickFixProcessors">
  <quickFixProcessor
    class="quickfixes.CustomQuickFixProcessor"
    id="quickfixes.quickFixProcessor">
  </quickFixProcessor>
</extension>
Run Code Online (Sandbox Code Playgroud)

我的自定义标记出现在Eclipse的Problems View中,但是当我右键单击自定义问题时,Quick Fix菜单项被禁用.

尝试2:

我重申IMarker marker = resource.createMarker("custom.marker");IMarker marker = resource.createMarker(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);.作为此更改的结果,当我右键单击"问题视图"中的自定义问题时,"快速修复"菜单项变为可用,但是,当我选择它时,会弹出一个对话框,指出没有可用的选项问题.但是,我验证了CustomQuickFixProcessor.hasCorrections(ICompilationUnit, int)调用并返回true,但是,CustomQuickFixProcessor.getCorrections(IInvocationContext, IProblemLocation[])没有被调用.

尝试3:

尝试3是尝试2的延续.我IJavaModelMarker.ID按如下方式设置自定义标记:

marker.setAttribute(IJavaModelMarker.ID, IProblem.ExternalProblemFixable);
Run Code Online (Sandbox Code Playgroud)

因此,CustomQuickFixProcessor.getCorrections当我将鼠标悬停在编辑器中的自定义标记上时,或者单击Java编辑器左边缘的灯光构建时,会调用它.但是,当我在"问题视图"中选择标记时,右键单击标记,然后选择"快速修复"菜单项,CustomQuickFixProcessor.getCorrections不会调用,并出现一个对话框,说明没有可用的快速修复. …

java eclipse eclipse-jdt

14
推荐指数
2
解决办法
2427
查看次数

为什么Eclipse生成的equals()实现在类型检查(instanceof)之前检查null?

我经常使用Eclipse的代码生成工具(Source/Generate hashCode()和equals()...)来为简单的POJO类创建equals()实现.如果我选择"使用instanceof来比较类型",则会生成类似于此的equals()实现:

  @Override
  public boolean equals(Object obj) {
      if (this == obj) {
          return true;
      }
      if (obj == null) {
          return false;
      }
      if (!(obj instanceof MyClass)) {
          return false;
      }
      MyClass other = (MyClass) obj;
      // check the relevant fields for equality
  }
Run Code Online (Sandbox Code Playgroud)

今天一位同事指出,第二个if语句根本不是必需的,因为只要obj为null,类型检查的instanceof就会返回false.(见问题3328138.)

现在,我想那些为Eclipse JDT编写代码模板的人也值得他们的盐.所以我认为这个空检查必须有一些原因,但我不确定它是什么?

(还有问题7570764可能会给出一个提示:如果我们使用getClass()比较进行类型检查而不是instanceof,obj.getClass()不是null安全.如果我们使用instanceof,可能代码模板不够聪明,不能忽略null检查.)

编辑:Dragan在他的回答中注意到,类型检查的instanceof不是Eclipse中的默认设置,所以我编辑了这个问题.但这并没有改变任何事情.

另外请不要建议我使用getClass()或(甚至更好!)一个不同的IDE.这不是重点,不能回答这个问题.我没有询问有关如何编写equals()实现的建议,无论是使用instanceof还是getClass()等.

问题大致是:这是Eclipse中的一个小错误吗?如果不是,那为什么它有资格成为一个功能?

java eclipse-jdt

14
推荐指数
1
解决办法
842
查看次数

13
推荐指数
2
解决办法
3409
查看次数

如何在Eclipse插件中获得"主动编辑器"?

在我的Eclipse插件中,我需要知道屏幕上可见的编辑器何时发生了变化.我目前正在使用如下活动编辑器:

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor()
Run Code Online (Sandbox Code Playgroud)

这适用于大多数情况,除非按下绿色的"继续"按钮:

调试器按钮

如果我使用F8快捷方式,则活动编辑器将按预期更新.

似乎在编辑器选项卡获得焦点之前不会更新活动编辑器属性(按下"继续"按钮时不会发生这种情况).

有没有其他路线我可以采取"可见编辑器"?

提前致谢.

艾伦

java eclipse eclipse-plugin eclipse-cdt eclipse-jdt

13
推荐指数
1
解决办法
1万
查看次数

在maven组件中使用eclipse编译器

我正在开发一个相当大的Maven项目,并使用Eclipse在Java中进行开发.

为了节省编译时间,我希望Maven和Eclipse共享相同的目标,我设法做到了.但是当我使用Maven编译时,Eclipse缺少一些它放在字节码中的东西,所以它重新编译了所有内容(根据我的理解).我在这里讨论"自动构建"功能,因此不是Eclipse将构建委托给Maven.

为了解决这个问题,我想我会要求Maven使用与Eclipse相同的编译器.在网上进行了一些搜索之后,我发现我可以在顶部添加它pom:

<build>
...
<plugins>
...
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
           <compilerId>eclipse</compilerId>
           <source>1.5</source>
           <target>1.5</target>
           <optimize>true</optimize>
   </configuration>
   <dependencies>
           <dependency>
                   <groupId>org.codehaus.plexus</groupId>
                   <artifactId>plexus-compiler-eclipse</artifactId>
                   <version>1.8.1</version>
           </dependency>
   </dependencies>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

这看起来很有效,但是构建失败很快就会出现很多错误,而使用javac会成功.我不确定为什么,但似乎存在一些与生成文件失败的Java文件有关的冲突.

所以我想我可以尝试仅将Eclipse编译器用于我正在处理的组件(没有那种生成的文件).我在pom我的组件中添加了上面的代码片段,但是当构建到达我的组件时,会引发以下错误:

没有这样的编译器'eclipse'

我还尝试plexus-compiler-eclipse在顶部pom中列出的依赖项中添加依赖项,但是同样的错误.

你知道我想做什么是可能的吗?我有什么办法吗?

java eclipse maven eclipse-jdt

12
推荐指数
1
解决办法
6412
查看次数

Eclipse查找方法的引用

我想找到以下类的方法"get"的所有调用者:

package com.zzz.zzz.zzz.services;

public final class EMF {
  private static final EntityManagerFactory emfInstance =
    Persistence.createEntityManagerFactory("obamaCareIsGood4U");

  private EMF() {}

  public static EntityManagerFactory get() {
    return emfInstance;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以我高举文本"get"并右键单击References - project.但是它返回了对每个名为"get"的方法的引用,而不仅仅是对com.zzz.zzz.zzz.services.EMF.get()的引用.

这是一个日食错误吗?如何让Eclipse仅显示对com.zzz.zzz.zzz.services.EMF.get()的引用?

Eclipse Platform  Version:
4.2.0.v20120608-135145-9JF7BHV8FyMteji0Oi_ePMz0xuZ8TVo7lV0z0ecb
Build id:
I20120608-1400,

Spring Tool Suite Version: 3.0.0.M3 Build Id: 201207050802 
Run Code Online (Sandbox Code Playgroud)

参考搜索输出:

com.google.common.base - guava-12.0.jar - C:\Users\SofiaVergara\.m2\repository\com\google\guava\guava\12.0 - PatientCare
com.google.common.base - guava-gwt-12.0.jar - C:\Users\SofiaVergara\.m2\repository\com\google\guava\guava-gwt\12.0 - PatientCare
com.google.gwt.junit.server - gwt-user-2.4.0.jar - C:\Users\SofiaVergara\.m2\repository\com\google\gwt\gwt-user\2.4.0 - PatientCare
com.google.gwt.requestfactory.server - gwt-servlet-2.2.0.jar - C:\Users\SofiaVergara\.m2\repository\com\google\gwt\gwt-servlet\2.2.0 - PatientCare
com.google.gwt.resources.rg - gwt-user-2.4.0.jar - C:\Users\SofiaVergara\.m2\repository\com\google\gwt\gwt-user\2.4.0 …
Run Code Online (Sandbox Code Playgroud)

java eclipse eclipse-jdt

12
推荐指数
3
解决办法
2万
查看次数

如何在Eclipse中添加自定义SuppressWarnings令牌

我正在为Eclipse编写一个PMD插件,它允许用户通过添加注释来抑制PMD警告@SuppressWarnings("PMD.ReturnEmptyArrayRatherThanNull").由于Eclipse不知道这PMD.ReturnEmptyArrayRatherThanNull是一个有效的令牌,它会警告令牌不受支持,并提供快速修复以删除它.

它怎么能让Eclipse知道这实际上是一个支持的SuppressWarnings令牌,它不应该用警告标记它?

我不是在寻找用户可以抑制警告的方式.我知道Eclipse中的"忽略SuppressWarnings中未处理的令牌"首选项.这是一种解决方法,并且缺点是Eclipse根本不报告任何不受支持的令牌,因此很难在例如SuppressWarnings令牌中找到拼写错误.

我正在寻找的是我作为插件开发人员可以扩展Eclipse的方式,因此它将PMD令牌识别为支持的SuppressWarnings令牌.

到目前为止,我只发现Eclipse支持的令牌被硬编码到Eclipse Java编译器中,但没有找到扩展点或其他东西,可以让我将PMD令牌添加到支持的SuppressWarnings令牌列表中.

eclipse eclipse-plugin suppress-warnings eclipse-jdt

12
推荐指数
1
解决办法
1317
查看次数

为什么类通过自定义类路径容器添加到jar中而不能用于代码完成?

通过代码完成中可见的自定义类路径容器提供的类是什么?

我已成功实现了一个自定义类路径容器,它将库添加到项目中.它将特定文件夹中的所有jar添加到构建路径,除非工作区中有一个具有相同名称的项目,在这种情况下引用项目.

现在这显然似乎有效,当我从其中一个jar中引用一个类时,代码编译,但我没有在代码完成建议中看到该类.当我在我的工作区中有正确的项目时,我在代码完成中看到了这样一个类.

我已经完成了以下步骤来实现这一目标,而我正在部分考虑IBM教程:

  • 实现ClasspathContainerInitializer
  • 实现ClasspathContainerPreferencePage以进行其他配置
  • 实现IClasspathContainer

当我将容器添加到项目中时,我会看到包浏览器中的jar,就像我预期的那样.(只有当没有相应的项目可用时,Jar才会出现,Logging会显示预期的结果)

我可以使用通过类路径容器集成的jar中没有编译器错误的类,它们不能用于代码完成,而在Quick Fixes中可以添加正确的导入.所以我想我可能只是错过了一些扩展点的贡献.

java eclipse eclipse-plugin eclipse-jdt

12
推荐指数
1
解决办法
575
查看次数

告诉Eclipse只自动完成方法名称?

假设我正在编辑一行......

obj.fooBar(x, y, z);
Run Code Online (Sandbox Code Playgroud)

我想将方法​​名称更改为fooSomethingElse,但保留大部分参数.如果我删除全部或部分名称,然后使用内容辅助,它会完成方法名称,但会启动一个新的arg列表...

obj.fooSomethingElse(arg1, arg2)(x, y, z)
                     ^---- this arg is highlighted for editing
Run Code Online (Sandbox Code Playgroud)

我经常要删除"(arg1,arg2)".我可以在首选项中关闭"填充方法参数",然后我只需要删除"()",但它仍然很烦人.是否有另一个命令只能完成方法名称.理想情况下,它只是来自通用内容辅助的单独命令和键组合,因此我可以根据需要调用其中一个.

eclipse autocomplete eclipse-jdt

11
推荐指数
1
解决办法
1763
查看次数