2011-10-17 62 views
0

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

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

其实我已经做了一些不花哨的是注入outputDirectory和自定义类加载器我递归加载我的生成文件夹中的所有类。

谢谢

回答

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); 
} 
0

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

你能更好地解释你的Mojo做了什么以及你希望它与哪个阶段和目标绑定。

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

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

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

允许这种行为的其他插件(如maven-antrun-plugin)提供了一种改变Mojo内部类路径的机制,并使用pom.xml的<configuration>部分来做到这一点。目前还不清楚你使用的插件是Maven还是你写的插件?

验证和包装是一个有效的用例。但是我质疑为什么在“classpath”上?我猜想你对流程类阶段具有约束力。

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

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

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

更新:如果你真的从你的Mojo中加载你检查到的JVM类,那么至少应该实现你自己的ClassLoader。这不一定是一个简单的问题要解决。您可以使此ClassLoader从输入目录中的配置中找到指定的内容。

+0

我已经更新了我的问题,以更好地解释。 – Cemo