Lo que trato de hacer es escribir algunos plugins Maven que escaneen las clases de aplicaciones buscando la implementación de una interfaz en particular (pueden ser clases con alguna anotación también) y base en el resultado generando algún código. Implementé correctamente el complemento que se ejecuta en la fase de generación de fuentes y escribí el código fuente en el directorio de fuentes generadas.explorando el classpath de Java en el plugin maven
El problema está en escanear classpath para las implementaciones/clases de interfaz particulares con alguna anotación. estoy usando la biblioteca Reflections para escanear las clases de la siguiente manera:
private Set<Class< ? extends MyInterface >> scan(final String packageName) {
final Reflections reflections = new Reflections(packageName);
return reflections.getSubTypesOf(MyInterface.class);
}
Desafortunadamente, este método devuelve conjunto vacío. Cuando imprimo mi ruta de clase de la clase que se extiende org.apache.maven.plugin.AbstractMojo
(el mismo en el que estoy usando Reflections) me sale el siguiente resultado:
/home/pd5108/apache-maven-2.2.1/boot/classworlds- 1.1.jar
Las clases que quiero encontrar utilizando Reflections existen tanto en los JAR como en el módulo dentro del cual se configura el complemento. Al observar el classpath impreso, parece que en este momento (fase generate-sources) las dependencias definidas en maven no están disponibles aún en classpath, probablemente se agreguen en las siguientes fases. ¿Es eso cierto? ¿Hay algún otro enfoque que pueda usar?
Aquí es la forma en cómo se imprime ruta de clases:
URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();
for(int i=0; i< urls.length; i++) {
System.out.println(urls[i].getFile());
}
Es la opción que considero un último recurso ... Como tengo muchas clases implementando esta interfaz y todas ellas se consideran en la generación de código, me gustaría evitar escribirlas "estáticamente". Además, estas clases se agregan/eliminan con frecuencia. –
Siempre podría tener un script de shell que hizo algo así como grep todos los archivos java para "implementa X" y luego analizar los nombres de clase y crear un archivo de propiedades de ellos. Luego, haga que su complemento use ese archivo de propiedades para saber a qué clases generar código extra también. Si no estás en Unix, podrías emular el grep en Java, supongo, pero sería mucho más lento. – Michael