2016-02-11 8 views
11

Ich habe ein Kesselblech-Projekt nach dem umfangreichen vagella-Tycho-Tutorial erstellt.Verwenden von Drittanbieterbibliotheken in Eclipse RCP Tycho App

enter image description here

Fakten:

  • Es gibt keine Funktion, und es gibt kein Plugin. Das einzige Plugin ist die RCP-App, die auch der Einstiegspunkt ist.

Problem:

  • Ich habe keine Ahnung, in welchem ​​pom.xml ich die 3rd-Party-Abhängigkeiten enthalten.

  • I nicht sind sie in dem RCP-Projekt, weil die Verpackung dieser pom eclipse-plugin ist, und nicht jar. Wenn ich die Verpackung nach jar ändere, wird die Bibliothek "Maven Dependencies" automatisch hinzugefügt. Wenn ich zurück zu eclipse-plugin ändere, werden sie entfernt.

Fragen:

  • Wo füge ich die Abhängigkeiten? Es gibt keine Pom mit jar Verpackung in meinem Projekt.
  • Sollte ich ein separates Projekt mit den erforderlichen JARs erstellen? Wie schließe ich diese Abhängigkeit in mein gesamtes Projekt ein?
  • Ist es wirklich eine gute Übung, ein separates Plugin und eine Funktion für diese RCP-App zu erstellen?

Verwandte Lösungen:

  • "Update-Projekte" funktionieren nicht, und weder die n andere Lösungen in den anderen SO Fragen tun.
  • Es gibt auch this question und that question, aber ich habe nicht ganz die Antworten
+0

Über welche Abhängigkeiten sprechen Sie? Bibliotheken von Drittanbietern? Der einfachste Weg besteht darin, sie in den Klassenpfad des Projekts einzufügen und zu fragen, ob sie in den build.properties-Dateien eingefügt werden sollen (über den Plugin-Editor, wenn Sie auf plugin.xml doppelklicken).Wenn Sie Eclipse-Plugin-Abhängigkeiten benötigen, können Sie diese auch mit dem Plugin-Editor hinzufügen. auch du sprichst von maven, nimmst du tycho mit maven? Wenn ja, Maven mit dem Tycho-Plugin verwendet die Dats in Ihren plugin.xml/manifest/build.properties ... Dateien, um Ihr Plugin zu erstellen – titou10

+1

Es sollte eine MANIFEST.MF geben, die mit jedem Plugin verbunden ist, wo normalerweise Abhängigkeiten sind Sind genannt. – SomeDude

+0

@ titou10 Ich möchte die Abhängigkeiten nicht manuell hinzufügen .. Ich benutze Maven + Tycho. Ich weiß nur nicht in welcher pom.xml, von welchem ​​Projekt, sollte ich die Abhängigkeiten hinzufügen. – GGrec

Antwort

15

Ich denke, dass Sie ein grundlegendes Missverständnis haben.

Maven: Maven bestimmt alle Projektabhängigkeiten über die pom.xml und transitiv löst Abhängigkeiten automatisch (unter der Annahme, dass alle der pom-Dateien und Artefakte in Repositories vorhanden sind, die Sie konfiguriert haben und deren Abhängigkeiten korrekt deklarieren).

Tycho: Das Problem ist, dass Eclipse bereits ein eigenes Projektmodell basierend auf Produktdateien, feature.xml-Dateien und Plug-in-MANIFEST.MF-Dateien hat. Tycho nutzt die Maven-Maschinerie für Eclipse, aber die Idee ist, dass die pom.xml-Dateien nur die Maven-Plugins konfigurieren und den Verpackungstyp deklarieren. Das bietet einen Einstiegspunkt für Maven, aber dann übernimmt Tycho. Während Maven normalerweise die Abhängigkeitskette von Informationen im Pom aufbauen würde.XML-Dateien erstellt Tycho die Abhängigkeitsänderung von Informationen in den Produkt-, Feature- und MANIFEST.MF-Dateien. Sie fügen keine Abhängigkeiten in die pom.xml-Dateien ein. Tycho verwendet auch Eclipse p2-Repositorys (anstelle von normalen Maven-Repositories), um abhängige Plug-Ins zu finden, die nicht in den lokalen Modulen oder der Zielplattform gefunden werden.

Das ist eigentlich ein Vorteil für viele Eclipse-Entwickler, da sie bereits alles richtig in ihren Eclipse-Plugins, -Features und -Produkten eingerichtet haben. Sie möchten nicht alle Abhängigkeiten in der pom.xml wiederholen müssen.

Verwenden von Bibliotheken in Eclipse-Plug-ins: Wenn Sie in Eclipse eine Bibliothek verwenden möchten, die nicht bereits als Eclipse-Plug-in gepackt ist, stehen Ihnen einige Optionen zur Verfügung. Ihr Plug-in kann eine Reihe von JARs in einen libs-Ordner aufnehmen und dann diesen libs-Ordner in den Plug-in- und den classpath-Klassenpfad aufnehmen (siehe Datei build.properties). Eine weitere Möglichkeit besteht darin, ein eigenes "Bibliotheks-Plug-In" zu erstellen, das eine JAR-Bibliothek als Eclipse-Plug-in neu verpackt. Siehe auch https://wiki.eclipse.org/FAQ_What_is_the_classpath_of_a_plug-in%3F. Das ist die Antwort, die du oben bekommst.

Das Problem ist, wenn Sie versuchen, eine komplexe Bibliothek mit mehreren JARs aufzunehmen, die normalerweise verteilt und in einem Standard-Java-Projekt über Maven enthalten ist. Wir haben dieses Problem mit der Jersey JAX-RS-Implementierung in meinem Projekt gefunden. Es gibt kein p2-Repository, das alle Teile der Bibliotheken als Plug-Ins mit korrekten Abhängigkeitsinformationen enthält.

Easy Solution: Wenn Sie eine gemeinsame Bibliothek benötigen, überprüfen Sie die Orbit-Projekt zunächst, ob die Bibliotheken zu sehen, bereits als Eclipse-Plug-ins verpackt worden, http://www.eclipse.org/orbit/. In diesem Fall können Sie sie herunterladen und in Ihre Zielplattform einbinden, oder Sie können sie dynamisch zur (Tycho) Build-Zeit aus ihrem p2-Repository abrufen. Ihre Plugins würden diese Plug-Ins nur als Abhängigkeiten enthalten (in ihren MANIFEST.MF-Dateien).

Problemumgehung/Lösung: In unserem Fall war Jersey JAX-RS nicht als Eclipse-Plug-in verfügbar, und es hatte eine Reihe von transitiven Abhängigkeiten. Die Problemumgehung bestand darin, ein Eclipse "Bibliotheks-Plug-In" wie oben erwähnt mit zwei Pom-Dateien zu erstellen. Wir haben zunächst ein Skeleton-Plug-in mit einem leeren libs-Ordner erstellt. Eine Pom-Datei ist nur eine Standard-Maven-Pom-Datei mit <packaging>jar</packaging>, die die Abhängigkeiten auf oberster Ebene deklariert, die erforderlich sind, um die Jersey JAX-RS-Implementierung und alle ihre Abhängigkeiten abzurufen. Die Abhängigkeiten werden mit <scope>compile</scope> deklariert. Wir verwenden das maven-dependency-plugin, um all diese Abhängigkeiten in den libs-Ordner des Projekts zu kopieren. wir überprüften nur die Plug-in mit all seinen abhängigen JAR-Dateien in der Quellcodeverwaltung

<plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>libs</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Wir haben letztendlich Maven mit diesem Pom angerannt von Hand von Zeit zu Zeit, um die Libs zu aktualisieren, und dann. Wenn ich den Build später überprüfe, sehe ich, dass wir den Ordner libs direkt mit Maven füllen, mit einer separaten Build-Aufgabe, kurz bevor wir den Maven/Tycho-Teil des Builds starten. Selbstverständlich stammen die Einträge Bundle-ClassPath und Export-Paket der Plug-In-Datei MANIFEST-MF aus der Quellcodeverwaltung. Wir müssen diese von Zeit zu Zeit überprüfen, um sicherzustellen, dass sie mit den Bibliotheken und Paketen übereinstimmen, die wir von Maven erhalten. (Das ändert nicht viel, wenn wir nicht größere Bibliotheksversionen oder eine neue Abhängigkeit auf der Maven-Ebene hinzufügen.) Die Datei build.properties des Plugins enthält den Ordner libs/als Teil von bin.includes.

In der Entwicklungsumgebung, nachdem wir zuerst den Code auschecken, führen wir gerade mvn (mit einer External Tools Launch-Konfiguration, die auch mit dem Projekt eingecheckt ist) auf die "Copy Dependencies" -Pom-Datei des Projekts. Dadurch wird der Ordner libs mit allen JAX-RS-Bibliotheken und -Abhängigkeiten gefüllt.Wir müssen es nur noch einmal ausführen, wenn wir etwas über die Abhängigkeiten aktualisieren oder wenn wir zwischen Zweigen springen, die unterschiedliche Versionen der JAX-RS-Abhängigkeiten haben. Wir stellen .gitignore ein, um sicherzustellen, dass wir die Bibliotheken nicht an Git übergeben.

Die andere Pom für dieses Projekt ist wie eine normale Tycho Pom-Datei mit <packaging>eclipse-plugin</packaging> eingerichtet. Während unseres automatisierten Builds führen wir einen Schritt zu Beginn des Build-Prozesses (direkt nach dem Auschecken) aus, der mvn mit dem jar pom aufruft, um die libs zu füllen. Dann fahren wir mit dem Main Maven/Tycho Build fort, indem wir das Eclipse-Plugin Pom verwenden. Das Eclipse-Plugin Pom hat keine Abhängigkeitsinformationen (wie ich oben sagte). Es bietet Tycho nur eine Möglichkeit, das Eclipse-Plug-In zu erkennen und basierend auf den Dateien MANIFEST.MF und build.properties zu erstellen. Das integrierte Plug-In enthält jedoch alle diese Bibliotheken, die durch den mvn-Aufruf in den jar-pom-Schritt eingefügt wurden, und macht sie verfügbar.

Also, es ist ein bisschen durcheinander, aber das ist die beste Lösung, die wir vor ein paar Jahren gefunden haben, als wir dieses Problem hatten. Ich bin mir nicht sicher, ob Tycho irgendeine Arbeit macht, um eine Art hybriden Maven/Tycho-Build zu erlauben, der dies automatisch als Teil des Builds tun könnte. Ich denke, ich sollte die Entwickler fragen. :)

Ihre Fragen:

  • Wo füge ich die Abhängigkeiten? In meinem Projekt gibt es keinen Pom mit Glasverpackung. Antwort: Die obige Problemumgehung ermöglicht es Ihnen, dies mit einem Projekt zu tun. Sie haben nur zwei Pom-Dateien, wie pom_deps.xml und pom.xml. Sie müssen nur die Datei pom_deps.xml separat aufrufen, um den libs-Ordner zu füllen (in der Entwicklungsumgebung und mit Ihren automatisierten Builds).
  • Sollte ich ein separates Projekt mit den erforderlichen JARs erstellen? Wie schließe ich diese Abhängigkeit in mein gesamtes Projekt ein? Antwort: Die oben beschriebene Problemumgehung ermöglicht es Ihnen, dies mit einem einzigen Projekt zu tun. Eine andere Möglichkeit, dies zu tun, ist ein separates JAR-Projekt zu erstellen, aber ich denke nicht, dass Ihre Eclipse RCP-App wirklich ein <packaging>jar</packaging> Modul in einer nützlichen Weise enthalten kann. Der einzige Weg, den ich gefunden habe, ist eine ähnliche Problemumgehung zu verwenden. Sie erstellen das JAR-Modul zuerst, installieren es im maven-Repository und lassen dann eines Ihrer Plug-in-Projekte das JAR in seinem libs-Ordner bündeln. (Wenn Sie das wirklich so machen wollen, fragen Sie. Wir haben einen Fall, in dem wir das auch tun müssen, und ich kann die Schritte, die wir in der Entwicklung und dem Build machen, zur Verfügung stellen. Ich denke, die einzige Projektumgehung das, das ich oben zur Verfügung gestellt habe, macht mehr Sinn für deinen Fall.)
  • Ist es wirklich so viel eine gute Praxis, ein unterschiedliches Einsteckfach und eine Eigenschaft für diese RCP APP zu verursachen? Antwort: das ist wirklich eine separate Frage. Wenn Sie eine Funktion mit mehreren Plug-Ins haben, haben Sie das gleiche Problem. Tycho kann mit den Produkten/Features/Plug-Ins umgehen, aber es kann nicht in die Maven-basierte Abhängigkeitsauflösung springen. Sie werden am Ende mit den gleichen Abhilfen verwenden

Zusammenfassung: Das grundlegende Problem ist, dass Eclipse-Plug-In kann nicht „sehen“ mit einer nackten JAR-Bibliothek. Das Plug-in muss die Bibliothek in seinem lokalen libs-Ordner enthalten (mit einem passenden Bundle-ClassPath-Eintrag in MANIFEST.MF), oder es muss von einem anderen Plug-in abhängig sein, das die entsprechenden Pakete exportiert. Tycho löst nur Abhängigkeiten über Eclipse-Plug-Ins auf und kann die normale Maven-Abhängigkeitsauflösung nicht direkt nutzen, um eine Menge JARs einzubinden. Wenn alle Abhängigkeiten bereits Plug-Ins sind, ist alles in Ordnung. Wenn nicht, müssen Sie möglicherweise die obige Problemumgehung verwenden, um eine Reihe von Bibliotheken zu packen, die Sie für Ihre Plug-ins verwenden können.