2016-04-16 8 views
0

Das hat mich wirklich verwirrt.Fiddly Sache mit bin-Verzeichnis in Eclipse zu tun

In meinem Eclipse-Arbeitsbereich habe ich ein Projekt namens "Java Scratchpad". Im "Package Explorer" sehen Sie "src" (Source Folder) unter diesem und dann "root" (Package). Unter "root" befindet sich eine .java-Datei namens "LoggingTest.java".

Der Pfad zu dieser Java-Datei lautet also "G: \ Eigene Dateien \ software projects \ workspace \ Java scratchpad \ src \ root \ LoggingTest.java".

Wenn ich den folgenden Code in Eclipse ausführen:

 Path currentRelativePath = Paths.get(""); 
     String s_currRelPath = currentRelativePath.toAbsolutePath().toString(); 
     String pathWithForwardSlashes = s_currRelPath.replace("\\", "/"); 
     System.out.println("path " + pathWithForwardSlashes); 

Das Ergebnis ist

Pfad G:/Eigene Dateien/Software-Projekten/Arbeitsbereich/Java Scratchpad

Aber ... wenn ich denselben Code an der Eingabeaufforderung abspiele, muss ich in folgendem Verzeichnis starten:

G: \ Eigene Dateien \ Software-Projekte \ Arbeitsplatz \ Java Scratchpad \ sind

... und dann an der Eingabeaufforderung gehen>java root.LoggingTest.

Die Ausgabe des obigen Bit-Code ist dann:

Pfad G:/Eigene Dateien/Software-Projekten/Arbeitsbereich/Java Scratchpad/bin

Mit anderen Worten, wenn Wenn Sie das Objekt an der Eingabeaufforderung ausführen, führen Sie eine .class-Datei im Verzeichnis \ bin aus. Wenn Sie jedoch in Eclipse ausgeführt wird, gibt das Eclipse-Framework vor, dass das Verzeichnis bin nicht vorhanden ist.

Und das Ergebnis ist, dass ich unterschiedliche Werte für den "aktuellen relativen Pfad" (CWD) abhängig davon, ob ich in Eclipse oder an der Eingabeaufforderung ausgeführt werde. Wenn ich ein Verzeichnis relativ zur CWD erstellen oder verwenden möchte, bekomme ich unterschiedliche Werte abhängig davon, ob ich in Eclipse oder an der Eingabeaufforderung laufe.

Ich fühle mich heute Nacht ziemlich langsam. Was soll ich machen? Gibt es eine Möglichkeit festzustellen, ob ein Projekt in Eclipse oder an der Eingabeaufforderung ausgeführt wird? Oder sollte ich einfach versuchen zu erkennen, ob der Pfad in "\ bin" endet und diese vier Zeichen entfernen, um die Pfade äquivalent zu machen?

später

Hinzufügen einfach eine Anmerkung in Antwort auf den Kommentar von E-Riz:

Es ist eine einfache Sache: Ich möchte Protokolle erstellen, und ich will Lucene-Indizes erstellen .. Und um die Dinge an einem Ort zu halten (in diesem Stadium sowieso), möchte ich diesen Ausgang nur an einen Ort wie ...\Java scratchpad\output\indices\[name of index] bzw. ...\Java scratchpad\output\logging\[name of log] setzen.

Und ja, natürlich weiß ich zur Zeit den absoluten Weg, den es hier gibt ... aber wie der Name schon sagt, ist dies ein "Scratchpad" oder Testgebiet ...Dann kann dieser Code, der die CWD verwendet, um zu bestimmen, wo Logs oder Indizes abgelegt oder gefunden werden sollen, generischer verwendet werden, ohne die absoluten Pfade kennen zu müssen.

Aber es muss entweder in Eclipse oder an der Eingabeaufforderung funktionieren ...!

NB meine aktuelle Workaround ist in der Tat zu überprüfen, ob pathWithForwardSlashes endet in "\ bin", und wenn ja, diese letzten 4 Zeichen zu löschen. Ich kann nicht die einzige Person sein, der diese Kuriosität begegnet ist. Wetten, es gibt klügere Lösungen!

+0

Dies ist erklärbar, aber zuerst, warum erklären Sie nicht, was Ihr Endziel ist. Mit anderen Worten, was versuchen Sie relativ zum aktuellen Arbeitsverzeichnis zu erreichen? Ich bin mir ziemlich sicher, dass die beste (n) Antwort (en) davon abhängen werden, ob man das eigentliche Ziel jenseits von "Was ist das aktuelle Arbeitsverzeichnis?" –

Antwort

1

Es gibt ein paar Fakten, die Sie im Auge wissen oder halten sollen:

  • Zur Laufzeit kann Java (sollte) eine Classpath gegeben werden, mit zu arbeiten; Der Standardanwendungsklassenpfad ist nur . (das aktuelle Verzeichnis, in dem java aufgerufen wurde). Aus diesem Grund scheint es, dass Sie Ihr Programm aus dem Verzeichnis \bin Ihres Projekts ausführen müssen; weil du der JVM nirgendwo anders gesagt hast, nach Klassen zu suchen. Sie sollten setting the runtime classpath beim Ausführen Ihrer Anwendung sein, was auf verschiedene Arten geschehen kann, aber für einfache Programme wird oft über eine Batch-Datei oder Shell-Skript getan. Beachten Sie, dass die Verwendung von -cp zur Angabe des Klassenpfads von entscheidender Bedeutung ist, wenn Sie auf JARs angewiesen sind.
  • Da in Eclipse Anwendungen nicht über eine Befehlszeile ausgeführt werden, verfügt Eclipse über Startkonfigurationen, die alle für das Starten eines Programms erforderlichen Details kapseln (im "Ausführen" - oder "Debug" -Modus). Here's a decent tutorial (obwohl ein bisschen veraltet; Sie können viele weitere Informationen über Launch-Konfigurationen dort auf den Interwebs finden. Der Schlüssel der Konfiguration, die Sie suchen, ist auf der Registerkarte Argumente, wo Sie das Arbeitsverzeichnis für ein Programm angeben können Launch config. Der Standard ist das root-Verzeichnis des Projekts. Sehen Sie, wie das anders ist als wenn Sie Ihre on-Befehlszeile ausgeführt haben? Das erklärt den Unterschied, den Sie in der Ausgabe sehen. Sie könnten das Arbeitsverzeichnis in der Eclipse-Startkonfiguration ändern. . aber ich neige bevorzugen sie als Projektstamm zu halten

also, Sie haben ein paar Optionen, um die Dinge konsistent zu machen: verwenden Sie einen Skript/Batch-App auf der Kommandozeile ausgeführt werden, unter Angabe -cp so die JVM kennt w Hier sind Ihre Klassendateien (und alle anderen JARs, die es möglicherweise auch brauchen könnte); oder, konfigurieren Sie Ihren Eclipse-Start so neu, dass er mit dem übereinstimmt, von dem Sie in der Befehlszeile starten. Ich denke, die (bei weitem) bevorzugte Option ist die erste.

Nachdem all das gesagt wurde, sollten Sie in der Regel keine Pfadmanipulation durchführen müssen, wenn es um Dateien/Ressourcen in Java geht. Alles ist relativ zum aktuellen Arbeitsverzeichnis, in dem Java ausgeführt wurde, oder zum Klassenpfad.

+0

vielen dank für die klare erklärung ... –