1

我正在编写一个普通的 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?

4

1 回答 1

2

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

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

剩下两个选择:

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

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

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

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

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

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

于 2019-08-16T19:34:42.410 回答