0

我创建了一个自定义 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

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

干杯,凯杰德

4

1 回答 1

0

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

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

        Reflections reflections = new Reflections(classLoader, sourcePackage);

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

希望这对其他人有帮助。

谢谢。

于 2020-06-24T22:26:05.450 回答