11

我想使用 Google Reflections 从我的 Maven 插件编译的项目中扫描类。但是插件默认看不到项目的编译类。从Maven 3 文档我读到:

需要从项目的 compile/runtime/test 类路径加载类的插件需要结合 mojo 注解 @requiresDependencyResolution 创建自定义 URLClassLoader。

这至少可以说有点模糊。基本上我需要一个对加载已编译项目类的类加载器的引用。我怎么得到它?

编辑:

好的,@Mojo注释有requiresDependencyResolution参数,所以这很简单,但仍然需要正确的方法来构建类加载器。

4

1 回答 1

12
@Component
private MavenProject project;

@SuppressWarnings("unchecked")
@Override
public void execute() throws MojoExecutionException {
    List<String> classpathElements = null;
    try {
        classpathElements = project.getCompileClasspathElements();
        List<URL> projectClasspathList = new ArrayList<URL>();
        for (String element : classpathElements) {
            try {
                projectClasspathList.add(new File(element).toURI().toURL());
            } catch (MalformedURLException e) {
                throw new MojoExecutionException(element + " is an invalid classpath element", e);
            }
        }

        URLClassLoader loader = new URLClassLoader(projectClasspathList.toArray(new URL[0]));
        // ... and now you can pass the above classloader to Reflections

    } catch (ClassNotFoundException e) {
        throw new MojoExecutionException(e.getMessage());
    } catch (DependencyResolutionRequiredException e) {
        new MojoExecutionException("Dependency resolution failed", e);
    }
}
于 2013-11-01T12:10:02.717 回答