Eclipse Scout 的 JavaParser 和 SymbolSolver
JavaParser and SymbolSolver for Eclipse Scout
我想分析 类 之间的依赖关系,我已经开始使用 JavaParser and it's SymbolResolver for. But it keeps failing when resolving several of the method references on a sample project from Eclipse Scout. Scout uses it's own 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 runtime 和调用 BEANS 时使用的 BeanManager 的问题,后者是关于 Scout SDK 的问题,您可以下载 here:Scout Developers 的 Eclipse IDE。
我假设您想分析源代码。当您下载上面提到的 Eclipse 包时,您将获得 Eclipse IDE 以及用于 Eclipse Scout 的附加插件。这些插件使用 Eclipse 平台提供的工具来分析 Scout 类。因此,我建议您查看 Eclipse Scout SDK source-code 并使用相同的工具进行分析。请确保您选择的发布分支与您的 Scout 项目的版本相匹配。
我想分析 类 之间的依赖关系,我已经开始使用 JavaParser and it's SymbolResolver for. But it keeps failing when resolving several of the method references on a sample project from Eclipse Scout. Scout uses it's own 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 runtime 和调用 BEANS 时使用的 BeanManager 的问题,后者是关于 Scout SDK 的问题,您可以下载 here:Scout Developers 的 Eclipse IDE。
我假设您想分析源代码。当您下载上面提到的 Eclipse 包时,您将获得 Eclipse IDE 以及用于 Eclipse Scout 的附加插件。这些插件使用 Eclipse 平台提供的工具来分析 Scout 类。因此,我建议您查看 Eclipse Scout SDK source-code 并使用相同的工具进行分析。请确保您选择的发布分支与您的 Scout 项目的版本相匹配。