Maven插件Reflections无法获取注解方法集合?

有如下 Maven 插件代码:

@Mojo(name = "generate")
public class GenerateMojo extends AbstractMojo {

    @Parameter(defaultValue = "${project.build.outputDirectory}", required = true)
    private File outputDirectory;

    @Parameter
    private File outputFile;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        Set<String> permissionCodeSet = new HashSet<>();

        URL url;
        try {
            url = outputDirectory.toURI().toURL();
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
        getLog().info(url.toString());

        Reflections reflections = new Reflections(
                new ConfigurationBuilder()
                        .addUrls(url)
                        .setScanners(MethodsAnnotated));

        reflections.getStore().forEach((s, stringSetMap) -> {
            stringSetMap.forEach((k, v) -> {
                System.out.println(k);
                v.forEach(System.out::println);
                System.out.println();
            });
        });

        Set<Method> resources =
                reflections.get(MethodsAnnotated.with(GetMapping.class).as(Method.class));
        System.out.println("resources = " + resources);

        Set<Method> methodSet =
                reflections.get(MethodsAnnotated.with(SaCheckPermission.class).as(Method.class));
        getLog().info(methodSet.toString());


        methodSet.forEach(method -> {
            SaCheckPermission saCheckPermission = method.getAnnotation(SaCheckPermission.class);
            List<String> values = List.of(saCheckPermission.value());
            permissionCodeSet.addAll(values);
        });
        getLog().info(permissionCodeSet.toString());
    }
}

Reflections 能够正确实例化并扫描成功,日志如下:

[INFO] Reflections took 67 ms to scan 1 urls, producing 7 keys and 79 values

尝试打印 store 内容也正确,但 methodSet 和 permissionCodeSet 均为空

尝试在使用插件的项目中运行上述代码,能够正常输出内容。

阅读 1.2k
avatarAI BotBETA

您遇到的问题可能是由于Maven插件在运行时与其所依赖的项目的类路径不完全相同。Maven插件通常在一个隔离的类加载器环境中运行,这意味着它可能无法访问项目的类路径中的类。

在您的代码中,reflections.get(MethodsAnnotated.with(SaCheckPermission.class).as(Method.class)); 这一行试图从类路径中找到所有带有 SaCheckPermission 注解的方法。然而,如果 SaCheckPermission 注解或其所在的类在Maven插件的类路径中不可用,那么 reflections.get() 方法将不会返回任何结果。

为了解决这个问题,您可以尝试以下步骤:

  1. 确保依赖正确:确保 SaCheckPermission 注解或其所在的类在Maven插件的 pom.xml 文件中作为依赖项正确声明。这样,Maven插件在运行时将能够访问这些类。
  2. 使用项目的类加载器:如果可能的话,尝试使用项目的类加载器来加载 Reflections。这样,Reflections 将能够访问项目的类路径中的类。这可能需要一些额外的代码来获取项目的类加载器,并将其传递给 Reflections
  3. 检查注解的保留策略:确保 SaCheckPermission 注解的保留策略是 RUNTIME。如果注解的保留策略是 SOURCECLASS,那么在编译后它们将不再存在,因此 Reflections 无法找到它们。
  4. 检查注解的使用:确保在您的项目中有实际使用 SaCheckPermission 注解的方法。如果没有任何方法使用这个注解,那么 reflections.get() 方法将不会返回任何结果。

如果以上步骤都无法解决问题,您可能需要进一步调查Maven插件的类加载器行为,或者考虑使用其他方法来获取带有特定注解的方法集合。

1 个回答

可能的问题与排查步骤:

  1. 扫描范围确认
    确保 outputDirectory 指向的目录包含了含有 GetMappingSaCheckPermission 注解的方法的已编译类文件。
  2. 类加载与注解保留策略
    确认 GetMappingSaCheckPermission 注解的保留策略为 RUNTIME,允许在运行时通过反射获取注解信息。同时,确保类加载器能够正确加载这些类文件。
  3. 注解使用核查
    检查代码中 GetMappingSaCheckPermission 注解是否正确应用在方法级别,并且在待扫描的类中确实存在这些注解。
  4. 注解处理器校验
    确认 MethodsAnnotatedScanner 正确实现了发现带有指定注解方法的功能。

为进一步解决此问题,推荐在代码中增加详细的日志输出,以便精准了解 Reflections 是否在扫描过程中涵盖了期望的类和方法。同时,全面审核目标项目中注解的实际使用情况和构建流程也是至关重要的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题