Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JDT在独立Java应用程序中提取IcompilationUnits_Java_Eclipse_Eclipse Jdt_Compilationunit - Fatal编程技术网

使用JDT在独立Java应用程序中提取IcompilationUnits

使用JDT在独立Java应用程序中提取IcompilationUnits,java,eclipse,eclipse-jdt,compilationunit,Java,Eclipse,Eclipse Jdt,Compilationunit,我正在编写一个普通的Java应用程序,希望提取输入项目的所有ICompilationUnit(这不是必需的) 由Eclipse开发)。由于我没有开发Eclipse插件,因此无法使用以下代码提取ICompilationUnit: IWorkspace workspace = ResourcesPlugin.getWorkspace(); IPath path = Path.fromOSString(source.getAbsolutePath()); IFile file = workspace.

我正在编写一个普通的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文件的源代码)

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

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

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

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

从理论上讲,您可以实现自己的索引,但这绝对不是推荐的

还有两种选择:

  • 如注释中所述,使用您自己对现有类的遍历,或者

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

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

    • PDE是一种无头应用程序,用于运行JDT自己的测试。工作区在使用
      -data
      命令行参数传递的位置中自动可用
    • JDT的,它提供了大量实用程序,用于以编程方式创建和配置Java项目
    • AbstractJavaModelTests的子类,其中有无数关于如何使用这些Java项目的示例,包括搜索
    如果您想看到所有的活动,我建议您在源代码中设置一个包含JDT和PDE项目的工作区。最简单的方法就是这样做


    如果您选择任何测试类,调用
    run as>run configurations…
    然后创建类型为
    JUnit Plug-in-test
    的启动配置,并在选项卡
    Main
    上选择
    运行应用程序:[无应用程序]-无头模式

    您指的是什么“提取ICompilationUnits”?使用
    编译单元
    可以执行
    cu.accept(new ASTVisitor(true){…})
    查找特定元素。我想使用搜索引擎(ICompilationUnit[]工作副本)正因为如此,我需要提取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
    中,使用
    IBinding binding=node.resolveBinding()至少覆盖
    QualifiedName
    SimpleName
    方法;
    当且仅当
    binding instanceof IMethodBinding
    为true,并且对于字段访问,以下为true时,才有方法调用或引用:
    binding instanceof IVariableBinding
    ((IVariableBinding)binding)。isField()
    。请提供第二个选项中的示例代码。@Arash您可能对我在GitHub上提供的示例感兴趣。我在JUnit测试中运行JDT代码,并将示例分为两类:独立的和需要osgi的
    ICompilationUnit icu = (ICompilationUnit)compilationUnit.getJavaElement();