8 Stimmen

Wie kann ich einen Eclipse .classpath Eintrag für bestimmte O/S-Plattform angeben?

Ich arbeite an einem SWT-Projekt als Teil eines Teams. Wir brechen ständig jede andere Build-Umgebung, weil Eclipses .classpath-Datei in die Versionskontrolle eingecheckt wird und wir verschiedene SWT-Bibliotheken für unsere Maschinen enthalten.

Je nachdem, wer die letzte Änderung vorgenommen hat, kann der .classpath-Eintrag lauten:

<classpathentry kind="lib" path="lib/swt/swt-win32.jar"/>

o

<classpathentry kind="lib" path="lib/swt/swt-carbon.jar"/>

o

<classpathentry kind="lib" path="lib/swt/swt-gtk.jar"/>

Es scheint, dass sich die Bibliotheken gegenseitig ausschließen, d.h. man kann sie nicht alle auf einmal einbinden und SWT das erledigen lassen. Also müssen wir sie für jede Plattform irgendwie filtern...

Hat jemand eine Idee, wie man das machen könnte? Meine ursprüngliche Idee war, dies in seine eigene ".classpath-swt" Datei (ignoriert von der VCS) zu teilen, automatisch generieren es mit Ant und fügen Sie es in der Haupt-.classpath, aber es scheint, Eclipse unterstützt nicht die Aufteilung der .classpath-Datei.

Unsere derzeitige Lösung besteht darin, den Klassenpfad nur dann zu übermitteln, wenn wir die Abhängigkeiten tatsächlich geändert haben. Dies bedeutet jedoch, dass eine Reihe von Personen ihre Entwicklungsumgebungen jedes Mal anpassen müssen, wenn der Klassenpfad geändert wird.

Jeder Vorschlag wird sehr geschätzt, solange es nicht "don't use Eclipse", da dies nicht eine Option für dieses Projekt ist :)

10voto

basszero Punkte 29038

In Eclipse können Sie Klassenpfadvariablen definieren, so dass Sie den Klassenpfad beibehalten können, aber jeder Entwickler würde sein Eclipse je nach Plattform konfigurieren. Sie könnten dann zumindest die .classpath-Datei versionieren. Sie müssen die Verzeichnisstruktur, in der Sie Ihre SWT-Jars speichern, so ändern, dass sich der Jar-Name nicht pro Plattform ändert. Dieses Menü ist zu finden unter: " Fenster->Einstellungen->Java->Build-Pfad "

SWTJARDIRECTORY/
    WIN32/
        SWT.JAR
    CARBON/
        SWT.JAR
    GTK/
        SWT.JAR

Ex.

    SWT_PLATFORM="SWTJARDIRECTORY/GTK", set by developer in Eclipse

.klassenpfad

    SWT_PLATFORM/SWT.JAR

1 Stimmen

Wie sieht das in der XML-Datei aus? Es wäre sehr hilfreich für andere, die tatsächliche Verwendung der Variablen im XML zu sehen (und Ihnen die Zeit zu sparen, zu recherchieren, wie Eclipse XML-Variablen parst)

0 Stimmen

Es sieht so aus, als müssten Sie eine Variable "erweitern" (Java Build Path > Add Variable > Extend), um sie in Ihrem Build Path zu verwenden. In Ihrer XML-Datei wird die Art auf var gesetzt: <classpathentry kind="var" path="SWT_PLATFORM/swt.jar"/>

1voto

Sie sollten diese Bibliotheken in einem separaten, leicht identifizierbaren Projekt haben, anstatt sie in jedem einzelnen Projekt zu platzieren.

Erstellen Sie z.B. ein Projekt mit dem Namen "00-swt-provider" (damit es ganz oben steht) und lassen Sie es auf eines von "00-swt-provider-carbon", "00-swt-provider-win32" oder "00-swt-provider-gtk" verweisen.

Beide exportieren die entsprechenden nativen Bibliotheken für die jeweilige Plattform, und der einzige Link befindet sich in 00-swt-provider. Das eigentliche Projekt verweist nur auf dieses Metaprojekt.

Wir verwenden intern eine Variante dieser Methode, die bei uns gut funktioniert.

0 Stimmen

Dies ist eine gute Idee, wenn Sie mehr als ein Projekt haben, da Sie Ihre SWT-Abhängigkeit für alle Projekte in einem einzigen Schritt festlegen können. Da wir aber nur ein Projekt haben, das von SWT abhängt, würde dies bedeuten, die Anzahl der Projekte von 1 auf 5 zu erhöhen. Ich denke, dass die Klassenpfadvariable eine bessere Lösung für dieses Problem ist.

0 Stimmen

Wenn ich dies tue, können andere Projekte, die zuvor die Jar in ihrem eigenen Klassenpfad verwiesen, nicht mehr "sehen" die Lib, obwohl Sie auf die "Lib Importer" Projekt abhängen, und die "Lib Importer" Projekt hat die Jar in seiner Eclipse-Buildpath-Menü enthalten, bin ich einen Schritt übersehen?

0voto

Wie wäre es, wenn Sie einfach Ihre eigenen Instanzen konfigurieren und diese eine Komponente Ihrer Umgebung nicht in der Versionskontrolle aufbewahren?

Alternativ könnten Sie eine Klassenpfaddatei für jede Umgebung speichern, vielleicht in einem anderen Verzeichnis, und in einer Ant-Datei, z. B. der build-setup-env.xml-Datei, könnten Sie einfach ein Ziel für jede Umgebung haben, das das richtige Ziel kopiert. Um eine Kopie davon in der Versionskontrolle zu behalten, müssten Sie sicher sein, dass Sie sie zurückkopieren, wenn sie aktualisiert wird.

0voto

qualidafial Punkte 6334

SWT tut dies durch no Versionierung der .classpath-Datei, sondern durch Versionen mehrerer separater .classpath_*-Dateien mit angehängtem Betriebssystem und Fenstersystem, z.B. .classpath_win32_win32. Wenn Sie also die Quellen aus dem Repository auschecken, wird von Ihnen erwartet, dass Sie die entsprechende Klassenpfaddatei nach .classpath kopieren und Ihr Projekt neu kompilieren.

0 Stimmen

Siehe den Kommentar von @basszero für eine bessere Lösung. Wir haben mehrere Klassenpfade in Erwägung gezogen, aber entschieden, dass dies zu einer Menge Potenzial für Fehler führen würde, da jemand auf einer Plattform etwas zu seinem Klassenpfad hinzufügen könnte, wodurch die anderen veraltet wären.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X