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