2012-02-04 10 views
5

Sto cercando di trovare un percorso per un file jar che si trova nel classpath raw. getRawClasspath restituisce una raccolta di oggetti IClasspathEntry. Posso chiamare getPath su quelli.Eclipse PDE: dato un percorso relativo come /ProjectName/lib/something.jar, come si ottiene un percorso completo del filesystem?

Ma getPath ritorna qualcosa di strano: un IPATH che inizia con il nome del progetto, come:

/ProjectName/lib/something.jar

Qual è il modo giusto per trasformare questo percorso relativo in un full- percorso del sistema operativo qualificato? All'inizio pensavo di poter semplicemente aggiungere il percorso alla radice dell'area di lavoro, ma ciò non funziona poiché ci sono spesso directory intermedie tra lo spazio di lavoro e il progetto.

E più in generale, come faccio a sapere cosa fare con un IPath restituito da un metodo? Sembra che non sappia mai cos'è IPath; relativo al progetto, relativo allo spazio di lavoro, relativo al progetto ma con il nome del progetto come il primo elemento, relativo alla fase della luna ... È tutto sconcertante, e la documentazione non è mai utile - o almeno io non Non so dove guardare.

UPDATE

sono ancora più confuso ora. Il problema è che, quando hai un IClasspathEntry, non è ancora chiaro come risolverlo su un percorso del filesystem.

La risposta che dice "se un percorso inizia con/è un percorso assoluto (relativo allo spazio di lavoro) non è corretto. Il problema è che il metodo getPath su un percorso IClass restituisce una di queste due cose: un percorso che inizia con una barra che è relativa all'area di lavoro, o un IPath che inizia con un/che è un vero percorso del filesystem.Sì, due tipi completamente diversi sono spinti in un tipo.Vieni la variante del filesystem quando il barattolo è al di fuori dell'area di lavoro, e ottieni la variante "assoluta" quando si trova nello spazio di lavoro

Penso che parte della risposta sia che un IPath, di per sé, è solo una stringa di fantasia: devi sapere da dove viene il suo significato. Non porta i dati giusti per essere utile da solo

Quindi qual è il modo giusto per affrontare questo?

risposta

5

provare questo:

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

che funziona (upvote), ma non risponde alla più ampia questione del "come avrei dovuto noto che "? Per esempio, non dovrebbe essere stata una ricerca sul progetto invece che sullo spazio di lavoro? –

+0

Se il percorso inizia con un '/' significa che è un percorso assoluto (relativo alla radice dello spazio di lavoro). In caso contrario, significa che è un percorso relativo, può essere relativo a qualsiasi contenitore ... È possibile utilizzare IPath.isAbsolute() per sapere se un percorso è un percorso assoluto. Per IProject.getRawClasspath di JDT utilizza sempre il percorso assoluto. – Dollyn

+0

Sto iniziando a pensare che il mio errore fondamentale è nel pensare che i percorsi di Eclipse abbiano qualcosa a che fare con i percorsi del sistema operativo. Il percorso assoluto di eclissi _always_ ha il progetto come primo elemento, indipendentemente dal percorso del file system? Quindi dovrei aspettarmi qualcosa in /Users/james/workspace/someSubDirectory/foo/ProjectX/src/Code.java per avere un percorso assoluto di /ProjectX/src/Code.java? –

-2

Ho un suggerimento, cercare attaccamento immagine, trovare "location" di proprietà di proprietà di alcun plugin di Eclipse, forse può trovare dove è da. ma scusa se non ho 10 reputazione, puoi vedere la foto da picture url

1

I percorsi in Eclipse sono complicati e ci sono alcune altre situazioni che non hai menzionato, come i contenitori del classpath (JRE è un esempio), risorse collegate al di fuori dell'area di lavoro e delle variabili del percorso di classe.

Per semplificare, suggerisco di utilizzare getResolvedClasspath invece che restituisce solo 'semplici' entrate del classpath (nessuna variabile, nessun contenitore). Secondo il suo Javadoc, restituisce percorsi assoluti, e la loro interpretazione dipende dal tipo di voce:

  • CPE_LIBRARY - se si tratta di una libreria esterna, si tratta di un percorso del file system (e non ha alcuna risorsa associata, significa che è possibile lo trovo con findMember).In caso contrario, si tratta di un percorso basato sulla radice di lavoro
  • CPE_PROJECT - percorso assoluto al progetto
  • CPE_SOURCE - percorso assoluto della cartella di origine

Tutti percorso assoluto vengono interpretati nello spazio di lavoro. Se è necessario il percorso del file system, è necessario passare attraverso getLocation.

Come nota a margine, non esiste una mappatura 1-a-1 tra entità del file system e risorse dell'area di lavoro. A causa dei collegamenti dell'area di lavoro, è possibile che diversi percorsi dell'area di lavoro puntino allo stesso percorso (file system).

0

Questo è il meglio che ho potuto venire con, ed è del tutto è un brutto hack, 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; 
    } 
}