有如下 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 均为空
尝试在使用插件的项目中运行上述代码,能够正常输出内容。
您遇到的问题可能是由于Maven插件在运行时与其所依赖的项目的类路径不完全相同。Maven插件通常在一个隔离的类加载器环境中运行,这意味着它可能无法访问项目的类路径中的类。
在您的代码中,reflections.get(MethodsAnnotated.with(SaCheckPermission.class).as(Method.class));
这一行试图从类路径中找到所有带有 SaCheckPermission
注解的方法。然而,如果 SaCheckPermission
注解或其所在的类在Maven插件的类路径中不可用,那么 reflections.get()
方法将不会返回任何结果。
为了解决这个问题,您可以尝试以下步骤:
SaCheckPermission
注解或其所在的类在Maven插件的 pom.xml
文件中作为依赖项正确声明。这样,Maven插件在运行时将能够访问这些类。Reflections
。这样,Reflections
将能够访问项目的类路径中的类。这可能需要一些额外的代码来获取项目的类加载器,并将其传递给 Reflections
。SaCheckPermission
注解的保留策略是 RUNTIME
。如果注解的保留策略是 SOURCE
或 CLASS
,那么在编译后它们将不再存在,因此 Reflections
无法找到它们。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