Access classes in a custom maven message plugin

I wrote a custom maven message plugin to output some basic information about spring -mvc classes. In my internal tests, I see the following code:

public Set<Class<?>> findControllerClasses(File buildOutputDir) throws IOException, ClassNotFoundException { Collection<URL> 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; } 

Works well when searching for annotated classes. However, when I use the reporting plugin in another project, annotated classes are not collected.

Can someone shed some light on how to access compiled classes for reporting purposes? Or is it even possible?

EDIT: partially resolved with a response to: Add the maven-build-class path to the plugin implementation plugin

However, this only loads classes if they have no dependencies outside of runtimeClasspathElements var for maven. Is there a way to combine these classes into a cool world?

+1
source share
2 answers

Ok Turning around in the answer in the above comment, the complete solution is to use Configurer, which takes into account both the path to the runtime and URLs from poms dependencies. Code shown below

 /** * * @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<String> runtimeClasspathElements = new HashSet<String>(); try { runtimeClasspathElements.addAll((List<String>) expressionEvaluator.evaluate("${project.runtimeClasspathElements}")); } catch (ExpressionEvaluationException e) { throw new ComponentConfigurationException("There was a problem evaluating: ${project.runtimeClasspathElements}", e); } Collection<URL> urls = buildURLs(runtimeClasspathElements); urls.addAll(buildAritfactDependencies(expressionEvaluator)); for (URL url : urls) { containerRealm.addConstituent(url); } } private Collection<URL> 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<URL> urls = new ArrayList<URL>(); 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<URL> buildURLs(Set<String> runtimeClasspathElements) throws ComponentConfigurationException { List<URL> urls = new ArrayList<URL>(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; } } 
0
source

Possible use

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

with

 private ClassLoader getProjectClassLoader() throws DependencyResolutionRequiredException, MalformedURLException { List<String> classPath = new ArrayList<String>(); 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 ); } 
+1
source

Source: https://habr.com/ru/post/1341279/


All Articles