标签: eclipse-jdt

Eclipse - 查找没有附加源的库的Java引用

环境

我有一个test-foo.jar只有两个文件的简单库:

  • 接口Foo用一种方法void doStuff()
  • Bar使用单个方法的类void executeFoo(Foo foo),只需调用foo.doStuff()

然后我有Eclipse Java项目,FooImpl它有一个实现的类Foo.该项目具有test-foo.jar构建路径条目.我没有附加此JAR的源代码.

Eclipse项目树

问题

现在让我说我对谁实际调用doStuff()方法有点好奇.所以我点击FooImpl#doStuff签名并按Ctrl+ Shift+ G(找到参考).我希望Bar#executeFoo在搜索结果中看到,但结果实际上是空的.

清空搜索结果

问题

我有点困惑,因为我认为这在Eclipse中有效(现在已经使用Eclipse了几年).但它似乎只适用于附带源代码的图书馆(我之前没有注意到).

有没有办法在没有附加源的情况下在项目库中查找类型(或方法)的引用(或用法)?为什么Eclipse没有索引并显示.class文件中的引用?


附加信息:

  • 一旦我将源代码附加到JAR,查找引用就会起作用.
  • 我很想知道为什么Eclipse JDT开发人员决定不在没有源的情况下索引搜索 .class.
  • 请注意,即使我没有源代码,知道谁调用我的方法也是非常有用的信息.
  • 在我看来,Eclipse的是索引方法的引用.class文件.
  • 顺便说一句,NetBeans"也不起作用";).

java eclipse eclipse-jdt

9
推荐指数
1
解决办法
4321
查看次数

Java重构工具

可能重复:
像ReSharper这样的工具,但对于Java?

我大量使用Eclipse提供的Java代码重构工具(提取接口,重命名方法等).有没有人知道其他类似的工具(最好是Eclipse插件)可以执行默认情况下在Eclipse中不可用的Java代码重构,或者可以更好地执行相同的重构?

我知道各种Eclipse插件可以识别需要重构的代码(例如FindBugs,UCDetector),但我正在寻找可以实际进行重构的工具.

java eclipse refactoring eclipse-jdt

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

以编程方式调用组织导入

我正在尝试以编程方式对我正在编辑的文件执行'OrganizeImports'.我的代码看起来像这样:

    final ICommandService cmdService = (ICommandService)PlatformUI.getWorkbench().getService    (ICommandService.class);
    if (cmdService != null) {
        final Command cmd = cmdService.getCommand(IJavaEditorActionDefinitionIds.ORGANIZE_IMPORTS);
        final ExecutionEvent execEvt = new ExecutionEvent(cmd, Collections.EMPTY_MAP, compileationUnit, null);

        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        ResourcesPlugin.getWorkspace().

        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                try {
                    //cmd.executeWithChecks(execEvt);
                    cmd.execute(execEvt);
                } catch (Exception e) {
                    getLogger().severe("organize imports failed: " + e.getMessage());
                }
            }
Run Code Online (Sandbox Code Playgroud)

我的问题是OrganizeImportsAction在当前选择上执行,这与我正在编辑的编译单元不同.我想在编译单元上以编程方式设置选择,但我不知道如何做到这一点.或者可能还有另一种触发OrganizeImports的方法.

谢谢,斯特凡

eclipse selection eclipse-jdt

8
推荐指数
1
解决办法
1361
查看次数

禁用部分javadoc的Eclipse代码格式

我有一个Java类,其中javadoc的一部分实际上是作为构建过程的一部分生成的:方法的返回值(静态字符串值)被插入到源文件中,就像$Revision: $标签在某些版本控制软件中工作一样.

虽然这种行为可能有问题,但我使用的框架(WEKA机器学习库)需要这种信息重复.我希望Eclipse的代码格式化程序不要干扰生成的注释.我正在使用Eclipse Indigo版本.

我可以用特殊的注释开启/格式化关闭//@formatter:on//@formatter:off.但是,@formatter标签仅在"正常"注释中起作用,而不在javadoc注释中起作用.显然,它们很容易与javadoc标签混淆.这意味着我无法关闭javadoc注释的生成部分的格式化程序(例如,自动换行),并将其保留为其余部分,因为@formatter指令必须放在javadoc注释周围.

有一个解决方法来切换javadoc注释中的代码格式?

eclipse code-generation javadoc weka eclipse-jdt

8
推荐指数
2
解决办法
4460
查看次数

Eclipse 3.8:调用层次结构错过了来自jar的调用者

Eclipse JDT 3.8中的Call Hierarchy视图似乎只显示当前项目/工作集中自己的类的引用/调用者.
来自jar/library的呼叫者不再显示.

相比之下,在eclipse <= 3.6中,显示了所有调用者,包括来自库的调用者.

例:

  1. CTRL-SHIFT-T; 打开DocumentBuilderFactory
  2. 在方法大纲中,右键单击 setAttribute()
  3. 选择Call Hierarchy从上下文菜单
  4. 确保在"呼叫"层次结构设置中启用" 显示呼叫者层次结构".

Eclipse 3.8显示没有匹配,而Eclipse 3.6显示(至少)一个匹配 (使用jdk 6测试)

(在"搜索范围"设置中,选中所有选项)

问题:
有没有办法在eclipse 3.8中启用以前的行为,还是一个bug?


(同样的问题可以在"Show Callee Hierachy"模式中看到 - 它不再显示来自jdk类的任何内部被调用者,例如比较被调用者ArrayList.get())

java eclipse ide callstack eclipse-jdt

8
推荐指数
1
解决办法
1477
查看次数

如何禁用 Eclipse 的“打字时自动折叠”?

Eclipse(任何版本的 AFAIK)有一些与 Java 代码折叠相关的奇怪行为。假设我正在编辑这个类:

class A {
  String field;
  @Nonnull 
  Object method(){
    // whatever
  }
}
Run Code Online (Sandbox Code Playgroud)

如果启用折叠并且我告诉它折叠所有内容(它是我的 Control-NumSlash,但可能是自定义的),则该方法正确折叠,即它仅显示Object?method()...该方法。到目前为止一切都很好。

困扰我的部分是,如果我将光标移动到 之后field;,按 Enter,然后键入“ public”之类的内容,然后停止一秒钟,Eclipse 会自动将该单词折叠到下面的方法中。

这似乎是合理的(大概是假设我想将该限定符添加到方法中);但在实践中,我实际上是在尝试添加一个新方法,然后停下来思考它的返回类型或者它的名称。(如果我想修改该方法,我会先展开它,因为它可能已经具有折叠的限定符。)

我充满激情地讨厌这个“功能”,但我终其一生都找不到如何禁用它的方法,甚至无法找到该死的插件(Eclipse 一直坚持认为我不应该被允许删除)中的哪一个负责以便我可以提交错误报告。

那么,有没有人知道(1)这种行为来自哪里,希望(2)我怎样才能摆脱它但保持手动折叠?谢谢!

(根据记录,我使用的是 Kepler SR1,但这种行为可以追溯到很长一段时间,至少五年左右。)

eclipse folding eclipse-jdt

8
推荐指数
1
解决办法
527
查看次数

如何将JDT添加为Maven依赖项?

我正在尝试创建一个依赖于JDT核心的项目.我正在使用Maven中心的条目,直到我意识到它们已经过时了几年.经过一番探索后,我遇到了https://repo.eclipse.org.我找到了我需要的存储库并添加了它:

<repository>
    <id>eclipse</id>
    <name>Eclipse Repository</name>
    <url>https://repo.eclipse.org/content/groups/eclipse/</url>
</repository>
...
<dependency>
    <groupId>org.eclipse.jdt</groupId>
    <artifactId>org.eclipse.jdt.core</artifactId>
    <version>3.10.0.v20140316-0146</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但后来我开始收到错误:

该类型org.eclipse.core.runtime.IProgressMonitor无法解决.它是从所需的.class文件间接引用的

我设法在其中一个Nexus存储库中找到了类型并添加了它:

<repository>
    <id>eclipse-acceleo</id>
    <name>Eclipse Repository</name>
    <url>https://repo.eclipse.org/content/groups/acceleo/</url>
</repository>
...
<dependency>
    <groupId>org.eclipse.equinox</groupId>
    <artifactId>org.eclipse.equinox.common</artifactId>
    <version>3.6.200.v20130402-1505</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

现在我收到了错误

该类型org.eclipse.core.runtime.Plugin无法解决.它是从所需的.class文件间接引用的

我无法在任何Nexus存储库中找到该类.org.eclipse.jdt.core.JavaCore是引用的类org.eclipse.core.runtime.Plugin.

1.我需要添加哪个依赖项org.eclipse.core.runtime.Plugin
2.有没有更好的方法将JDT作为Maven中的依赖项包含在内?

/ E1

我在http://grepcode.comorg.eclipse.core.runtime.Plugin的帮助下找到了.这一次,最新的依赖在Maven Central中(而不是在Eclipse的Nexus repo中):

<dependency>
    <groupId>org.eclipse.core</groupId>
    <artifactId>runtime</artifactId>
    <version>3.9.100-v20131218-1515</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

现在当我尝试运行我的测试时,我得到了以下异常:

java.lang.NoClassDefFoundError: org/eclipse/core/resources/IResource
    at org.eclipse.jdt.core.dom.ASTParser.<init>(ASTParser.java:177)
    at org.eclipse.jdt.core.dom.ASTParser.newParser(ASTParser.java:126)
    .
    .
    .
Caused by: java.lang.ClassNotFoundException: org.eclipse.core.resources.IResource
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372) …
Run Code Online (Sandbox Code Playgroud)

java eclipse maven eclipse-jdt

8
推荐指数
2
解决办法
3968
查看次数

在eclipse中更改调试视图的内容

我正在编写一个java框架,对于一个类文件sample.class,它会生成一个代理文件sample_proxy.class.当调用sample.testMethod()时,它会占用sample_proxy.class.我已经制作了一个eclipse插件来使断点工作, 在此输入图像描述

如果我从Main.java开始,并在sample.testMethod()中创建一个断点,下面的堆栈看起来像:Main.main - > sample.proxy_method - > sample_proxy.testMethod.
有没有办法让代理显示如下:Main.main - > sample.testMethod?

java eclipse eclipse-jdt

8
推荐指数
1
解决办法
320
查看次数

内容辅助不在Lambda Expressions中工作

我正在运行火星4.5.1.内容辅助在lamba表达式的代码块中根本不起作用.

obj.doSomething(param1 -> {
    // Content Assist doesn't work here
}
Run Code Online (Sandbox Code Playgroud)

代码块之外的任何内容自动完成.例如:param1会正确显示内容辅助.

它应该在4.5.0中修复,但对我来说似乎并非如此.

当我尝试通过取消选中"使用默认合规性设置" 手动设置1.8兼容性时,每次退出首选项时都会重新启用该框.编译器合规性级别设置为1.8,无济于事.

eclipse lambda eclipse-jdt java-8

8
推荐指数
0
解决办法
764
查看次数

泛型和lambda - javac和Eclipse编译器中的不同行为

注意:我发现了多个问题,指出了javacEclipse编译器之间的差异,但据我所知,所有这些问题都讨论了其他问题.

假设我们有这个方法:

public static <T, U> void foo(Supplier<T> a, Function<T, U> b, Consumer<U> c)
{
    c.accept(b.apply(a.get()));
}
Run Code Online (Sandbox Code Playgroud)

javac在编译对此方法的调用时,我发现Eclipse Java编译器与Eclipse Java编译器之间存在不同的行为,我不确定哪两个是正确的.


这种方法的简单用法可能是:

// variant 1
foo(
    () -> Optional.of("foo"),
    value -> value.get(),
    value -> System.out.println(value));
Run Code Online (Sandbox Code Playgroud)

编译器应该能够结合TOptional<String>使用所述第一参数,并UString使用所述第二.所以这个电话应该是有效的(在我看来).

这可以很好javac地编译,但无法使用Eclipse进行编译:

类型不匹配:无法从void转换为<unknown>

在第一个参数(() -> Optional.<String> of("foo"))中添加一个类型参数也使它在Eclipse中编译.

问题:从规范的角度来看,Eclipse是否正确拒绝此调用(以及为什么(不))?


现在假设我们想抛出一个自定义(运行时)异常,如果它Optional是空的:

// variant 2
foo(
    () -> Optional.of("foo"),
    value -> value.orElseThrow(() -> new RuntimeException()),
    value -> System.out.println(value));
Run Code Online (Sandbox Code Playgroud)

javac和Eclipse编译器都拒绝了,但是有不同的错误消息:

  • javac …

java javac eclipse-jdt java-8

8
推荐指数
1
解决办法
509
查看次数