validar una ruta relativa proyecto obtener leer dentro carpeta archivo aplicacion java eclipse eclipse-plugin annotation-processing

relativa - ruta de una carpeta en java



Eclipse-Procesador de anotaciones, obtenga la ruta del proyecto (2)

Estoy construyendo un plugin de procesador de anotación para eclipse, lo que me gustaría hacer es examinar varios archivos dentro de la carpeta del proyecto durante el procesamiento.

Me gustaría saber cómo puedo obtener la ruta del proyecto desde mi procesador. Creo que esto se puede hacer porque la ruta de origen del proyecto se proporciona al procesador, pero no puedo encontrar la manera de llegar a ella.

Intenté buscar en System.properties y en processingEnv.getOptions (), pero no hay información útil allí.

finalmente me gustaría utilizar este procesador de anotación en Netbeans también, así que si hay una API pública que puede proporcionar esta información, será la mejor, pero cualquier ayuda será apreciada.


ProsessingEnv ruta de origen de ProsessingEnv generando un archivo fuente:

String fetchSourcePath() { try { JavaFileObject generationForPath = processingEnv.getFiler().createSourceFile("PathFor" + getClass().getSimpleName()); Writer writer = generationForPath.openWriter(); String sourcePath = generationForPath.toUri().getPath(); writer.close(); generationForPath.delete(); return sourcePath; } catch (IOException e) { processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Unable to determine source file path!"); } return ""; }


El entorno de procesamiento le proporciona un Filer que se puede usar para cargar recursos (conocidos). Si necesita rutas absolutas para descubrir archivos o directorios, puede usar un JavaFileManager y un StandardLocation :

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null); Iterable<? extends File> locations = fm.getLocation(StandardLocation.SOURCE_PATH);

Si está utilizando Eclipse, necesita configurarlo para usar el JDK como tiempo de ejecución como lo señaló Bennyl en los comentarios.

Parece que no hay una API que esté obligada a devolver la ubicación de origen, por lo que la solución anterior no funcionará de manera confiable y solo con algunos entornos. El Filer, por ejemplo, solo es necesario para admitir CLASS_OUTPUT y SOURCE_OUTPUT .

La solución más fácil es, probablemente, suponer / requerir una estructura de proyecto específica, donde las clases compiladas se encuentran en un subdirectorio directo del proyecto (que es el predeterminado para la mayoría de IDE bin o target directorio de target Mavens). Si lo hace, puede crear un archivo de recursos temporales con el Filer en la ubicación SOURCE_OUTPUT y obtener la ruta desde ese archivo.

Filer filer = processingEnv.getFiler(); FileObject resource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", "tmp", (Element[]) null); Path projectPath = Paths.get(resource.toUri()).getParent().getParent(); resource.delete();