我想分析我开始使用JavaParser及其用于SymbolResolver的类之间的依赖关系。但是,从Eclipse Scout解析示例项目中的多个方法引用时,它始终会失败。 Scout使用它自己的BEAN manager,它在jvm启动时将Java类加载到一个列表中,这使得在运行时加载和卸载类更加灵活。但是Eclipse IDE能够以某种方式解决依赖关系。这是我用于解析Eclipse Scout项目的工作示例:

    private static String getFullyQualifiedName(MethodCallExpr exp) {
        String result = "";
        try {
            result = exp.getName() + " --> " + exp.resolve().getQualifiedSignature();
        } catch (RuntimeException e) {
            result = "!unable to resolve! " + exp.getName();
        }
        return result;
    }

    private static void runAnalysis(String sourceFolder) {
        final ProjectRoot projectRoot = new SymbolSolverCollectionStrategy().collect(new File(sourceFolder).toPath());
        projectRoot.getSourceRoots().forEach(sourceRoot -> sourceRoot.tryToParseParallelized()
            .forEach(parsedSource -> parsedSource.getResult().get().findAll(MethodCallExpr.class)
                .forEach(exp -> System.out.println(parsedSource.getResult().get().getPackageDeclaration().get().getNameAsString()
                    + "." + parsedSource.getResult().get().getStorage().get().getFileName()
                    + " (" + exp.getBegin().get().line + ") "
                    + getFullyQualifiedName(exp)))));
    }


我将所有maven依赖JAR以及所有源代码都添加到源根文件夹中,而我只是使用Scout中的简单helloworld示例。在我看来,为什么和何时起作用以及何时无法解决MethodCallEx似乎相当随机。 Java Symbol Solver甚至能够解析一些不错的BEAN.get()依赖项。

成功的输出如下所示:

scout.ui.html.UiServletFilter.java (66) destroy --> org.eclipse.scout.rt.server.commons.authentication.DevelopmentAccessController.destroy()


像这样的失败输出:

scout.server.helloworld.HelloWorldService.java (15) !unable to resolve! getUserId


但是Eclipse IDE能够解析所有类和方法调用。

最佳答案

您的分析是在运行时还是基于源代码在IDE中进行的?前者是有关Scout运行时和调用BEANS时使用的BeanManager的问题,后者是有关Scout SDK的问题,您可以下载here:Scout开发人员的Eclipse IDE。

我假设您想分析源代码。当下载上述Eclipse软件包时,您将获得带有Eclipse Scout附加插件的Eclipse IDE。这些插件使用Eclipse平台提供的工具来分析Scout类。因此,建议您查看Eclipse Scout SDK source-code并使用相同的工具进行分析。确保选择与Scout项目版本匹配的发布分支。

07-26 04:54