我正在尝试制作一个需要使用反射的Maven插件。我希望一个项目运行该插件,并在项目中为其提供类的全名,然后该插件将通过反射将其加载以从中获取信息。
但是类加载器有一些奇怪的地方,因为当我使用它时找不到它
Class.forName("package.MyClass");
查看"Guide to Maven Classloading",我无法完全确定我的插件的类加载器在其他项目中运行时是否可以访问该项目的类。
最佳答案
我敢肯定有更好的方法,但是这就是我的工作方式:
将以下内容添加到mojo顶部的javadoc中:
@requiresDependencyResolution运行时
添加一个MavenProject参数:
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject project;
然后,您可以在运行时获取依赖项,并创建自己的类加载器:
List runtimeClasspathElements = project.getRuntimeClasspathElements();
URL[] runtimeUrls = new URL[runtimeClasspathElements.size()];
for (int i = 0; i < runtimeClasspathElements.size(); i++) {
String element = (String) runtimeClasspathElements.get(i);
runtimeUrls[i] = new File(element).toURI().toURL();
}
URLClassLoader newLoader = new URLClassLoader(runtimeUrls,
Thread.currentThread().getContextClassLoader());
然后,您可以使用此新的类加载器加载类:
Class bundle = newLoader.loadClass("package.MyClass");
关于maven-2 - Maven插件无法加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/871708/