Eclipse现在让我疯了.这可能是微不足道的,但我只是不明白.每当我想添加断点时,常规图标都会在编辑器和断点视图中划掉.这是一个截图:
正如您可能已经猜到的,这不是严格意义上的图形问题;)在调试时会忽略断点.断点的属性也没有帮助.
任何提示都非常感谢!
编辑:
好的,所以它不是关于JDK或已安装的插件.似乎与工作区相关.我能尝试什么吗?
我想将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不会调用,并出现一个对话框,说明没有可用的快速修复. …
我经常使用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中的一个小错误吗?如果不是,那为什么它有资格成为一个功能?
我注意到日食JDT 使用void的基本类型.这可以被认为是正确的吗?
在我的Eclipse插件中,我需要知道屏幕上可见的编辑器何时发生了变化.我目前正在使用如下活动编辑器:
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor()
Run Code Online (Sandbox Code Playgroud)
这适用于大多数情况,除非按下绿色的"继续"按钮:

如果我使用F8快捷方式,则活动编辑器将按预期更新.
似乎在编辑器选项卡获得焦点之前不会更新活动编辑器属性(按下"继续"按钮时不会发生这种情况).
有没有其他路线我可以采取"可见编辑器"?
提前致谢.
艾伦
我正在开发一个相当大的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中列出的依赖项中添加依赖项,但是同样的错误.
你知道我想做什么是可能的吗?我有什么办法吗?
我想找到以下类的方法"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) 我正在为Eclipse编写一个PMD插件,它允许用户通过添加注释来抑制PMD警告@SuppressWarnings("PMD.ReturnEmptyArrayRatherThanNull").由于Eclipse不知道这PMD.ReturnEmptyArrayRatherThanNull是一个有效的令牌,它会警告令牌不受支持,并提供快速修复以删除它.
它怎么能让Eclipse知道这实际上是一个支持的SuppressWarnings令牌,它不应该用警告标记它?
我不是在寻找用户可以抑制警告的方式.我知道Eclipse中的"忽略SuppressWarnings中未处理的令牌"首选项.这是一种解决方法,并且缺点是Eclipse根本不报告任何不受支持的令牌,因此很难在例如SuppressWarnings令牌中找到拼写错误.
我正在寻找的是我作为插件开发人员可以扩展Eclipse的方式,因此它将PMD令牌识别为支持的SuppressWarnings令牌.
到目前为止,我只发现Eclipse支持的令牌被硬编码到Eclipse Java编译器中,但没有找到扩展点或其他东西,可以让我将PMD令牌添加到支持的SuppressWarnings令牌列表中.
通过代码完成中可见的自定义类路径容器提供的类是什么?
我已成功实现了一个自定义类路径容器,它将库添加到项目中.它将特定文件夹中的所有jar添加到构建路径,除非工作区中有一个具有相同名称的项目,在这种情况下引用项目.
现在这显然似乎有效,当我从其中一个jar中引用一个类时,代码编译,但我没有在代码完成建议中看到该类.当我在我的工作区中有正确的项目时,我在代码完成中看到了这样一个类.
我已经完成了以下步骤来实现这一目标,而我正在部分考虑IBM的教程:
当我将容器添加到项目中时,我会看到包浏览器中的jar,就像我预期的那样.(只有当没有相应的项目可用时,Jar才会出现,Logging会显示预期的结果)
我可以使用通过类路径容器集成的jar中没有编译器错误的类,它们不能用于代码完成,而在Quick Fixes中可以添加正确的导入.所以我想我可能只是错过了一些扩展点的贡献.
假设我正在编辑一行......
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-jdt ×10
eclipse ×9
java ×8
autocomplete ×1
debugging ×1
eclipse-cdt ×1
helios ×1
maven ×1
void ×1