Maven插件加载类

时间:2011-10-17 11:35:02

标签: class maven classloader maven-plugin maven-3

我有一个应用程序,它具有扩展org.apache.struts.StrutsActions的传统Struts操作。我想确保扩展StrutsActions的所有类都有自定义注释。

为了提供这个,我写了一个小的maven执行规则来验证我的要求。但是我不知道如何在我的mojo中加载我的类来验证它们。

实际上我做了一些不花哨的东西,就是注入outputDirectory和自定义类加载器,我已经递归地加载了我的构建文件夹中的所有类。

由于

2 个答案:

答案 0 :(得分:0)

所有课程?你是什​​么意思 ?也许你的意思是target / classes / **(这是类的默认输出位置)或者你的意思是一个多个目录树位置的列表?

您能否更好地解释您的Mojo的作用以及您希望它与之绑定的阶段和目标。

我想也许您正在考虑如何错误地将Maven的构建周期应用于您的项目。你能更好地解释一下你的插件是做什么的,也许是“打包”工作吗?

但是,如果我理解正确,您希望插件的执行能够为target / classes / **获取额外的类路径条目吗?那么它可以从项目本身加载代码和资源来改变maven-plugin中的一些动态行为吗?

执行此操作的默认方式是<dependency>,但当然这需要一个固定的单位。

允许此行为的其他插件(如maven-antrun-plugin)提供了改变Mojo内部类路径的机制,并使用来自pom.xml的<configuration>部分的内容来执行此操作。目前尚不清楚您使用的插件是Maven还是已编写的插件?

验证和打包是有效的用例。但我质疑为什么在“类路径”?我猜你会对进程类阶段具有约束力。

即。类路径用于向运行时提供代码/资源以执行。但在您的情况下,您有一个输入目录而不是类路径要求。

在Mojo中可以在输入目录* / .class上设置目录扫描程序,然后可以(使用某个库)打开每个文件并检查注释而不加载它

这也是不可靠输入数据与插件代码本身的一致行为之间的良好分离。如果项目决定要实现与插件本身实现中使用的相同的包和/或类,会发生什么。

更新:如果您确实正在从Mojo加载类,那么您需要将它们加载到JVM中,然后至少实现自己的ClassLoader来完成它。这不一定是要解决的简单问题。您可以使此ClassLoader在输入目录中查找从配置中指定的内容。

答案 1 :(得分:0)

我是在reflections

的帮助下完成的
  <dependency>
     <groupId>org.reflections</groupId>
     <artifactId>reflections</artifactId>
     <version>0.9.5</version>
  </dependency>

我的实现是这样的:

public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {

    URL url = getURL(helper.evaluate("${project.build.outputDirectory}"));

    Predicate<String> filter = new FilterBuilder().include(getTargetSuperTypeForSubtypes());
    Predicate<String> filter2 = new FilterBuilder().include(getMustHaveAnnotation());

    Reflections reflections = new Reflections(new ConfigurationBuilder()
     .setScanners(
        new TypeAnnotationsScanner().filterResultsBy(filter2),
        new SubTypesScanner().filterResultsBy(filter))
     .setUrls(url));

    validate(reflections);
}