2012-02-04 17 views
5

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?

Respuesta

5

intente esto:

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); 
    IResource res = root.findMember("/ProjectName/lib/something.jar"); 
    System.out.println(res.getLocation().toString()); 
+0

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? –

+0

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

+0

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? –

-2

Tengo una sugerencia, mira imagen adjunta, encontrar "localización" propiedad de propiedades de cualquier plug-in de Eclipse, tal vez puede encontrar un lugar donde es de. pero lo siento, no tengo reputación de 10, puede ver la imagen de picture url

1

Las rutas en Eclipse son complicadas, y hay algunas otras situaciones que no ha mencionado, como contenedores classpath (JRE es un ejemplo), recursos vinculados fuera del espacio de trabajo y las variables classpath.

En su lugar, sugiero que use getResolvedClasspath, que solo devuelve entradas de ruta de clase 'simples' (sin variables, sin contenedores). Según su Javadoc, devuelve rutas absolutas, y su interpretación depende del tipo de la entrada:

  • CPE_LIBRARY - si se trata de una biblioteca externa, es una ruta de sistema de archivos (y no tiene ningún recurso asociado, lo que significa que puede no lo encuentras con findMember).De lo contrario, es un camino basado en la raíz del espacio de trabajo
  • CPE_PROJECT - ruta absoluta al proyecto
  • CPE_SOURCE - ruta absoluta a la carpeta de origen

Todo ruta absoluta se interpretan en el espacio de trabajo. Si necesita la ruta del sistema de archivos, debe pasar por getLocation.

Como nota al margen, no hay una correspondencia de 1 a 1 entre las entidades del sistema de archivos y los recursos del espacio de trabajo. Debido a los enlaces del espacio de trabajo, puede tener varias rutas de espacio de trabajo que apuntan a la misma ubicación (sistema de archivos).

0

Esto es lo mejor que podía llegar a, y es totalmente es un truco feo, sí:

private IPath getCorrectAbsolutePath(IJavaProject project, IPath path) throws IllegalArgumentException { 
    final String projectName = project.getProject().getName(); 
    if (path.segmentCount() > 1 && path.segment(0).equals(projectName)) { 
     IPath projectAbsolutePath = project.getProject().getLocation(); 
     IPath relativePath = path.removeFirstSegments(1); 
     return projectAbsolutePath.append(relativePath); 
    } else { 
     if (!path.isAbsolute()) 
      path = path.makeAbsolute(); 
     if (!path.isAbsolute()) 
      throw new IllegalArgument("Cannot make IPath absolute: " + path.toString()); 
     return path; 
    } 
} 
Cuestiones relacionadas