我有一个应用程序,它具有扩展org.apache.struts.StrutsActions的传统Struts操作。我想确保扩展StrutsActions的所有类都有自定义注释。
为了提供这个,我写了一个小的maven执行规则来验证我的要求。但是我不知道如何在我的mojo中加载我的类来验证它们。
实际上我做了一些不花哨的东西,就是注入outputDirectory和自定义类加载器,我已经递归地加载了我的构建文件夹中的所有类。
由于
答案 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);
}