当前位置: 首页 > 知识库问答 >
问题:

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

宗政欣可
2024-03-27

有如下 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个答案

梁华皓
2024-03-27

您遇到的问题可能是由于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插件的类加载器行为,或者考虑使用其他方法来获取带有特定注解的方法集合。

 类似资料:
  • 我是Java EE和Maven的新手,所以我不确定需要哪些信息才能看到我犯了错误。 当我右键单击我的项目并进入Maven-->Reload project时,build选项卡打开,出现以下错误 当我悬停maven assembly插件时,IDE还告诉我 如果我需要任何进一步的信息,请告诉我。

  • 我是maven的新手,我已经用pom文件编写了自己的maven插件 然后,在我的IDE(intellij)中,我使用clean install安装maven插件 扎克

  • 我一直在尝试为 Java 工件的部署任务配置 Jenkins 作业。我希望用户能够选择要部署的工件版本,这些版本存储在Nexus存储库中。为此,我正在使用Maven元数据插件从存储库中获取工件版本列表。 问题是,由于java.net.UnknownHostException,Jenkins服务器无法解析存储库基本URL(https://nexus.repos.prod.com/nexus/cont

  • 我正在使用IntelliJ IDEA,并且我尝试通过maven安装依赖项,但它给了我以下错误: 我搜索过类似的问题,但它们都指代理问题,但是, 我可以在没有代理的情况下通过浏览器访问这些插件,我也尝试在IntelliJ IDEA中配置代理,但它也不起作用。 日志文件: 在通过intellij和bash成功编译和构建之后,仍然存在两个错误 这意味着什么以及如何修复读取依赖项中剩余的错误?

  • 无法执行目标组织。fortasoft:GradleMaven插件:1.0.8:在project server上调用(默认cli):执行目标组织的默认cli。fortasoft:GradleMaven插件:1.0.8:invoke失败:无法从“11.0.2”确定java版本。

  • Sonar和Jenkins位于同一台机器上,Sonar分析在Jenkins作业发布步骤中运行。詹金斯的工作是用Maven 3.0.5构建的。 一切都很好,直到我们从4.5更新了声纳。从昨天的x到5.1.2。 更新sonar后,步骤失败,出现异常: org.apache.maven.lifecycle.生命周期执行异常:未能执行目标org.codehaus.mojo: sonar-maven-plu