访问自定义maven报告插件中的类

我编写了一个自定义maven报告插件来输出有关spring-mvc类的一些基本信息。 在我的内部测试中,我可以看到这样的代码:

public Set<Class> findControllerClasses(File buildOutputDir) throws IOException, ClassNotFoundException { Collection urls = ClasspathHelper.forJavaClassPath(); if (buildOutputDir != null) { urls.add(buildOutputDir.toURI().toURL()); } Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(urls)); Set<Class> types = reflections.getTypesAnnotatedWith(Controller.class); return types; } 

拉入带注释的课程时效果很好。 但是,当我在另一个项目中使用报告插件时,不会选择带注释的类。

有人可以阐明如何访问已编译的类以进行报告吗? 或者这是否可能?

编辑:使用以下答案部分解决: 将maven-build-classpath添加到插件执行类路径

但是,如果它们在maven的runtimeClasspathElements var之外没有依赖项,那么它只加载类。 有没有办法将这些类合并到classrealm中?

也许用

 /** * The classpath elements of the project. * * @parameter expression="${project.runtimeClasspathElements}" * @required * @readonly */ private List classpathElements; 

 private ClassLoader getProjectClassLoader() throws DependencyResolutionRequiredException, MalformedURLException { List classPath = new ArrayList(); classPath.addAll( classpathElements ); classPath.add( project.getBuild().getOutputDirectory() ); URL[] urls = new URL[classPath.size()]; int i = 0; for ( String entry : classPath ) { getLog().debug( "use classPath entry " + entry ); urls[i] = new File( entry ).toURI().toURL(); i++; // Important } return new URLClassLoader( urls ); } 

好。 扩展上述注释中的答案,完整的解决方案是使用一个Configurer,它将运行时类路径和poms依赖项中的url都考虑在内。 代码如下所示

 /** * * @plexus.component * role="org.codehaus.plexus.component.configurator.ComponentConfigurator" * role-hint="include-project-dependencies" * @plexus.requirement role= * "org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup" * role-hint="default" * */ public class ClassRealmConfigurator extends AbstractComponentConfigurator { private final static Logger logger = Logger.getLogger(ClassRealmConfigurator.class.getName()); public void configureComponent(Object component, PlexusConfiguration configuration, ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm, ConfigurationListener listener) throws ComponentConfigurationException { addProjectDependenciesToClassRealm(expressionEvaluator, containerRealm); converterLookup.registerConverter(new ClassRealmConverter(containerRealm)); ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter(); converter.processConfiguration(converterLookup, component, containerRealm.getClassLoader(), configuration, expressionEvaluator, listener); } private void addProjectDependenciesToClassRealm(ExpressionEvaluator expressionEvaluator, ClassRealm containerRealm) throws ComponentConfigurationException { Set runtimeClasspathElements = new HashSet(); try { runtimeClasspathElements.addAll((List) expressionEvaluator.evaluate("${project.runtimeClasspathElements}")); } catch (ExpressionEvaluationException e) { throw new ComponentConfigurationException("There was a problem evaluating: ${project.runtimeClasspathElements}", e); } Collection urls = buildURLs(runtimeClasspathElements); urls.addAll(buildAritfactDependencies(expressionEvaluator)); for (URL url : urls) { containerRealm.addConstituent(url); } } private Collection buildAritfactDependencies(ExpressionEvaluator expressionEvaluator) throws ComponentConfigurationException { MavenProject project; try { project = (MavenProject) expressionEvaluator.evaluate("${project}"); } catch (ExpressionEvaluationException e1) { throw new ComponentConfigurationException("There was a problem evaluating: ${project}", e1); } Collection urls = new ArrayList(); for (Object a : project.getArtifacts()) { try { urls.add(((Artifact) a).getFile().toURI().toURL()); } catch (MalformedURLException e) { throw new ComponentConfigurationException("Unable to resolve artifact dependency: " + a, e); } } return urls; } private Collection buildURLs(Set runtimeClasspathElements) throws ComponentConfigurationException { List urls = new ArrayList(runtimeClasspathElements.size()); for (String element : runtimeClasspathElements) { try { final URL url = new File(element).toURI().toURL(); urls.add(url); } catch (MalformedURLException e) { throw new ComponentConfigurationException("Unable to access project dependency: " + element, e); } } return urls; } }