【问题标题】:Unable to find classes using org.reflections.Reflections from inside custom Maven plugin无法从自定义 Maven 插件中找到使用 org.reflections.Reflections 的类
【发布时间】:2020-06-24 13:31:22
【问题描述】:

我已经像这样创建了一个自定义 Maven 插件:

@Mojo(name="generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE) 
public class HandlerGeneratorMojo extends AbstractMojo {
...
}

我是这样使用它的:

            <!-- GENERATE EVENT HANDLERS (POC) -->
        <plugin>
            <artifactId>handler-generator-maven-plugin</artifactId>
            <groupId>my.group.id</groupId>
            <version>${revision}</version>
            <executions>
                <execution>
                    <id>generate handlers</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                    ...
                    </configuration>
                </execution>
            </executions>
        </plugin>

在 Mojo 的执行方法中,我尝试使用 Reflections api 检索扩展接口 CdsData 的所有接口。

        final Reflections reflections = new Reflections();
    
     final Set<Class<? extends CdsData>> allClasses = 
         reflections.getSubTypesOf(CdsData.class);

     log.info("Number of results: " + allClasses.size());
     
     for (final Class<? extends CdsData> cdsDataClass: allClasses) {

         log.info("Result: " + cdsDataClass);
     }

我得到五个结果,它们依赖于我执行插件的 pom。所以没关系。 但是我也使用另一个已设置的插件(cds4j-maven-plugin)生成了一些实现

<phase>generate-sources</phase>

我尝试将自定义插件的阶段设置为准备包,以便在上述插件生成源之后执行。 但是,我得到的结果并不比我之前提到的五个多。我也希望看到那些生成的接口。

这可能是类路径还是类加载器问题?或者可能是阶段?

我还尝试将生成的类的包放入 Reflections 构造函数中,并尝试按照第 8 行所述配置 Reflections 类加载:https://www.hellojava.com/a/80798.html

任何帮助表示赞赏!谢谢!

干杯, 凯杰尔德

【问题讨论】:

    标签: java maven classloader maven-plugin maven-mojo


    【解决方案1】:

    好的,终于解决了。这绝对是一个类加载问题。我需要添加一个指向类路径元素的类加载器,如下所述:http://blog.chalda.cz/2018/02/17/Maven-plugin-and-fight-with-classloading.html

    我将范围更改为流程类,基本上更改了博客中描述的所有内容,并使用了:

            Reflections reflections = new Reflections(classLoader, sourcePackage);
    

    其中 classloader 是按照该博客中的说明放在一起的类加载器,而 sourcePackage 是一个字符串,其中包含我想要的结果类型的包前缀。

    希望这对其他人有帮助。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 2018-06-03
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      相关资源
      最近更新 更多