【问题标题】:When does a Maven plugin have access to the projects classes?Maven 插件何时可以访问项目类?
【发布时间】:2014-02-11 17:57:34
【问题描述】:

我制作了一个 Maven 插件,用于验证和实例化项目中的类。 Maven 插件什么时候在类路径上有项目中的类?

插件不断抛出 ClassNotFoundException。

查看 Maven 文档并搜索后提出问题。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你到底想做什么? “验证”是什么意思。你在做一些字节码操作吗?否则 JUnit 可能就足够了......
  • 我想根据配置处理类。这与单元测试无关。它使用反射来验证配置,以确保类确实是配置所说的。

标签: java maven maven-plugin


【解决方案1】:

Maven 插件何时在类路径中包含项目中的类?

简短的回答是默认情况下不会。

看看Guide to Maven Classloading

具体来说:

请注意,插件类加载器既不包含当前项目的依赖项,也不包含其构建输出。相反,插件可以结合 Mojo API 规范中的 mojo 注释 requiresDependencyResolution 从 MavenProject 查询项目的编译、运行时和测试类路径。

如果您缺少某个知名工件的类,您可以将该工件添加为项目依赖项。

【讨论】:

  • 啊.. 这很有道理,但是在编译后我将如何加载当前项目的类。例如,我的插件的默认阶段是进程类。
  • 进程类阶段在编译之后,所以在这种情况下没有问题
  • 我可能遗漏了一些东西,但微薄的文档或“Maven 类加载指南”并没有太大帮助。当然有修改类路径或类领域的标准方法。
  • 您可以将requiresDependencyResolution 注释属性添加到您的mojo 注释中,例如@Mojo(name = "your-mojo-name", requiresDependencyResolution = ResolutionScope.COMPILE) 或使用等效的@requiresDependencyResolution Javadoc 标记
  • maven.apache.org/ref/3.1.1/maven-plugin-api/plugin.html 可能对插件注释的所有选项都有最好的描述。
【解决方案2】:

好的,所以我可以通过将输出目录添加到插件的 ClassRealm 来修改类加载。这对我来说仍然听起来很奇怪,但它确实有效。

final PluginDescriptor pluginDescriptor = (PluginDescriptor) getPluginContext().get("pluginDescriptor");
final ClassRealm classRealm = pluginDescriptor.getClassRealm();
final File classes = new File(getProject().getBuild().getOutputDirectory());
try
{
    classRealm.addURL(classes.toURI().toURL());
}
catch (MalformedURLException e)
{
     e.printStackTrace();
}

【讨论】:

  • 这似乎没有将我的项目的 maven 依赖项添加到类路径中。
猜你喜欢
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2019-02-11
  • 2022-10-01
  • 1970-01-01
相关资源
最近更新 更多