Estoy tratando de encontrar una ruta a un archivo jar que está en el classpath sin procesar. getRawClasspath devuelve una colección de objetos IClasspathEntry. Puedo llamar a getPath sobre esos.Eclipse PDE: dada una ruta relativa como/ProjectName/lib/something.jar, ¿cómo se obtiene una ruta completa del sistema de archivos?
Pero getPath vuelve algo raro: un iPath que comienza con el nombre del proyecto, como:
/ProjectName/lib/something.jar
¿Cuál es la forma correcta de convertir esta ruta relativa en un completo ruta del sistema operativo calificado? Al principio pensé que podría simplemente agregar la ruta a la raíz del espacio de trabajo, pero eso no funciona, ya que a menudo hay directorios intermedios entre el espacio de trabajo y el proyecto.
Y, en general, ¿cómo sé qué hacer con un IPath devuelto por un método? Parece que nunca sé qué es ese IPath; relativo al proyecto, relativo al espacio de trabajo, relativo al proyecto pero con el nombre del proyecto como primer elemento, relativo a la fase de la luna ... Es desconcertante, y la documentación nunca es útil, o al menos yo no No sé dónde mirar.
ACTUALIZACIÓN
estoy aún más confundido ahora. El problema es que, cuando tienes un IClasspathEntry, todavía no está claro cómo resolverlo en una ruta del sistema de archivos.
La respuesta que dice "si una ruta comienza con una/es una ruta absoluta (relativa al espacio de trabajo) no es correcta. El problema es que el método getPath en una IClasspath devuelve una de dos cosas: iniciar una ruta con una barra que es relativa al espacio de trabajo, o un IPath que comienza con una/que es una ruta real del sistema de archivos. Sí, dos cosas completamente diferentes se agrupan en un tipo. Obtiene la variante del sistema de archivos cuando el contenedor está fuera del área de trabajo y obtiene la variante "absoluta" cuando está en el área de trabajo.
Creo que parte de la respuesta es que un IPath, en sí mismo, es solo una cadena de fantasía. Tienes que saber de dónde viene para darle sentido. No posee el tipo correcto de información para ser útil por sí solo.
Entonces, ¿cuál es la forma correcta de lidiar con esto?
que funciona (upvote), pero no responde a la cuestión más amplia de "cómo debería tener sabido que "? ¿Por qué no debería haber sido una búsqueda en el proyecto en lugar del espacio de trabajo, por ejemplo? –
Si la ruta comienza con un '/' significa que es una ruta absoluta (relativa a la raíz del espacio de trabajo). Si no, significa que es una ruta relativa, puede ser relativa a cualquier contenedor ... Puede usar IPath.isAbsolute() para saber si una ruta es una ruta absoluta. Para IProject.getRawClasspath de JDT, siempre usa la ruta absoluta. – Dollyn
Empiezo a pensar que mi error básico es pensar que las rutas de Eclipse tienen algo que ver con las rutas de sistema operativo. ¿Un eclipse absolute path _always_ tiene el proyecto como primer elemento, sin importar cuál sea la ruta del sistema de archivos? Entonces, ¿debería esperar algo en /Users/james/workspace/someSubDirectory/foo/ProjectX/src/Code.java tener una ruta absoluta de /ProjectX/src/Code.java? –