【问题标题】:Use JDT to extract IcompilationUnits in a standalone Java application使用 JDT 在独立 Java 应用程序中提取 IcompilationUnits
【发布时间】:2019-08-16 11:30:28
【问题描述】:

我正在编写一个普通的 Java 应用程序,并想提取输入项目的所有 ICompilationUnit(这不是必需的 由 Eclipse 开发)。由于我不是在开发 Eclipse 插件,因此无法使用以下代码提取 ICompilationUnit:

IWorkspace workspace = ResourcesPlugin.getWorkspace();
IPath path = Path.fromOSString(source.getAbsolutePath());
IFile file = workspace.getRoot().getFileForLocation(path);
ICompilationUnit compilationUnit = (ICompilationUnit) JavaCore.create(file);

目前,我正在使用下面的代码来解析输入的 Java 文件。 (str包含输入java文件的源代码)

ASTParser parser = ASTParser.newParser(AST.JLS12);
parser.setSource(str.toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
CompilationUnit cu = (CompilationUnit) parser.createAST(null);

但是,下面的代码返回 null,因为它不是从 Java 元素创建的。

ICompilationUnit icu = (ICompilationUnit)compilationUnit.getJavaElement();

问题:有没有办法在普通的 Java 应用程序中提取 ICompilationUnits?

【问题讨论】:

  • "extract ICompilationUnits" 是什么意思?使用CompilationUnit,您可以使用cu.accept(new ASTVisitor(true) { ... }) 来查找特定元素。
  • 我想使用 SearchEngine(ICompilationUnit[] workingCopies),因此我需要提取 ICompilationUnit。
  • 我明白了。 getJavaElement 返回 null,因为 parser.setSource(str.toCharArray()); 而不是 parser.setSource(IClassFile)。我想使用ASTVisitor 而不是创建IClassFile 并使用SearchEngine 来查找特定元素会更容易。你在找什么?
  • 我想查找对项目中定义的方法和字段的所有调用。如果我正在编写一个 Eclipse 插件,有一个简单的方法。但是,由于我正在编写一个独立的应用程序 [ResourcesPlugin.getWorkspace();] 不起作用,我无法编写其余的说明。如果您知道使用 JDT 在独立 Java 应用程序中查找对方法和字段的引用的示例代码,请告诉我。
  • 如果在代码中添加parser.setEnvironment(...),则可以使用cu.accept(new ASTVisitor(true) { ... }) 访问AST 节点。在ASTVisitor 中,至少为QualifiedNameSimpleName 覆盖visit 方法。使用IBinding binding = node.resolveBinding();,当且仅当binding instanceof IMethodBinding 为真并且对于字段访问,以下条件为真时,您才有方法调用或引用:binding instanceof IVariableBinding((IVariableBinding)binding).isField()

标签: java eclipse eclipse-jdt compilationunit


【解决方案1】:

JDT 搜索引擎需要一个索引。在 IDE 中,索引是在工作区构建期间创建的。这意味着如果没有工作空间,就没有现成的方法来使用搜索引擎。

理论上可能实现自己的索引,但绝对不推荐。

剩下两个选项:

  1. 如评论中所述,使用您自己的现有类遍历,或

  2. 让您的应用程序在后台初始化一个工作区,您的代码将作为真正的 Java 项目导入其中。在构建该工作台之后,搜索引擎应该可用。所有这一切都可以在无需启动 Eclipse UI 的无头应用程序中发生。

有关选项 (2) 的灵感,您可以从这里开始:

  • PDE 的 CoreTestApplication,这是使用的无头应用程序,例如,用于运行 JDT 自己的测试。工作区在使用-data 命令行参数传递的位置自动可用。
  • JDT 的 AbstractJavaModelTests,它提供了大量实用程序,用于以编程方式创建和配置 Java 项目。
  • AbstractJavaModelTests 的子类,其中包含大量如何使用这些 Java 项目的示例,包括搜索

如果您想实时查看所有内容,我建议您在源代码中设置一个包含 JDT 和 PDE 项目的工作区。为此,最简单的方法是 use Oomph

上面的 CoreTestApplication 将会运行,如果你选择任何测试类,调用Run as > Run configurations... 然后创建一个JUnit Plug-in Test 类型的启动配置并在标签Main 上选择Run an application: [No Application] - Headless Mode

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2015-01-09
相关资源
最近更新 更多