Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自Maven Mojo的思考_Java_Maven_Classloader_Reflections - Fatal编程技术网

Java 来自Maven Mojo的思考

Java 来自Maven Mojo的思考,java,maven,classloader,reflections,Java,Maven,Classloader,Reflections,我想使用Google Reflections从我的Maven插件中扫描编译项目中的类。但是默认情况下插件看不到项目的编译类。我读到: 需要从项目的编译/运行时/测试类路径加载类的插件需要结合mojo注释@requiresDependencyResolution创建自定义URLClassLoader 至少可以说这有点模糊。基本上,我需要一个类加载器的引用来加载已编译的项目类。我怎么知道 编辑: 好的,@Mojo注释具有requiresdependencysolution参数,因此这很简单,但仍然需

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

需要从项目的编译/运行时/测试类路径加载类的插件需要结合mojo注释@requiresDependencyResolution创建自定义URLClassLoader

至少可以说这有点模糊。基本上,我需要一个类加载器的引用来加载已编译的项目类。我怎么知道

编辑:

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

@组件
@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);
    }
}
私人马文项目; @抑制警告(“未选中”) @凌驾 public void execute()引发MojoExecutionException异常{ List classpathElements=null; 试一试{ classpathElements=project.getCompileClasspathElements(); List projectClasspathList=新建ArrayList(); for(字符串元素:classpathElements){ 试一试{ 添加(新文件(元素).toURI().toul()); }捕获(格式错误){ 抛出新的MojoExecutionException(元素+“是无效的类路径元素”,e); } } URLClassLoader=新的URLClassLoader(projectClasspathList.toArray(新的URL[0]); //…现在您可以将上面的类加载器传递给反射 }catch(classnotfounde异常){ 抛出新的MojoExecutionException(例如getMessage()); }捕获(依赖解析要求例外e){ 新的MojoExecutionException(“依赖项解析失败”,e); } }
我认为“项目的编译(…)类路径”实际上仍然指的是它的依赖关系,而您可以归结为:“需要创建自定义类加载器”。我不明白这里的拦截器是什么。Google for custom classloader将提供大量示例。如果所有这些都失败了,您还可以查看一个在项目类上工作的现有Maven插件的源代码,并借用一些位和bob;然后,作为插件依赖项加载的类将是相同的实例,这将由ReflectionsThank返回!在我使用
Reflections#getAllTypes()
返回的类名之前,我在插件逻辑中发现了ClassNotFoundExceptions,直到我
Class.forName(type,true,loader)
其中loader是你的加载器