2008-11-28 5 views
10

Also begann ich mit einem Web-Service-Projekt (nur ein dynamisches Webprojekt), das korrekt von Eclipse erstellt und debuggt. Wir haben einen Teil des gemeinsamen Codes herausgezogen, den wir in eine gemeinsam genutzte Bibliothek einfügen möchten. Diese Klassen werden nun in ein separates Jar-Projekt geleitet, auf das das Webprojekt verweist.Eclipse-Debug-Zeit-Klassenpfadproblem: Wie binden Sie die Ausgabe eines abhängigen Projekts in den Laufzeitklassenpfad eines Webprojekts ein?

Auf dem Web-Projekt habe ich Projekt-> Eigenschaften-> Java Build Path-> Projekte-> Hinzufügen und hinzugefügt das Jar-Projekt. Und das hat alle Klassenpfadprobleme der Kompilierzeit korrekt gelöst, und alles baut gut auf. Aber zur Laufzeit, wenn der Tomcat-Server hochfährt, versucht spring, einige der in der JAR-Datei enthaltenen Klassen zu injizieren, und ich bekomme einen NoClassDefFoundError.

Meine Klassen- und Eigenschaftendateien und der Inhalt meines META-INF-Verzeichnisses werden im ./build-Verzeichnis angezeigt, aber mein WEB-INF/lib-Verzeichnis scheint direkt referenziert zu sein, und die Jar-Abhängigkeit funktioniert nicht Sie werden nicht in die Web App Library kopiert.

Was ist die magische Beschwörung, um Eclipse zu sagen, dass das andere Jar-Projekt zur Laufzeit dem Tomcat zur Verfügung stehen muss? Aus unserem Ameisen-Build-Skript bauen wir zuerst das andere Projekt in WEB-INF/lib und alles funktioniert gut, aber nicht für Eclipse-Debugging.

Antwort

9

Java EE-Modul Abhängigkeiten würden dieses Problem lösen. Sie haben bereits die Aufgabe ausgeführt, Ihre allgemeinen Klassen in ein eigenes Projekt zu extrahieren, möglicherweise, da andere Projekte von diesen Klassen abhängig sind. In beiden Fällen müssen Sie sicherstellen, dass es sich um ein Dienstprogrammprojekt handelt (das unter Java EE in den Projektassistenten angezeigt wird) und nicht nur über ein einfaches Java-Projekt. Ist das erledigt, können Sie mit dem Hinzufügen des Utility-Projekts zu Ihrem Build-Pfad (Pfad zur Kompilierzeit) fortfahren, wie Sie herausgefunden haben.

Der zusätzliche (letzte) Schritt besteht darin, eine Java EE-Modulabhängigkeit zwischen Ihrem Dynamic Web-Projekt und der gemeinsam genutzten Bibliothek herzustellen, wodurch die Klassen des Dienstprogramms während der Bereitstellung und sogar während des Exports in WEB-INF \ lib platziert werden der Krieg. Besuchen Sie dazu die Eigenschaften des dynamischen Webprojekts und navigieren Sie zu den Java EE-Modulabhängigkeiten. Stellen Sie sicher, dass Ihr Dienstprogramm hier ausgewählt ist. Stellen Sie Ihre Anwendung erneut bereit und veröffentlichen Sie sie, und Sie sollten gut unterwegs sein.

+0

Das scheint der Trick gewesen zu sein, aber ich bin mir nicht sicher, was Sie sagten, dass es ein "Dienstprogramm" Projekt war. Gibt es etwas, das ich in meiner .project-Datei oder in .settings/sehen kann, um mich wissen zu lassen, dass es der richtige Typ ist? –

+0

Hilfsprojekte sind Java-Projekte, obwohl sie eher für den J2EE-Kontext geeignet sind. Sie repräsentieren Ihren Code (keine JARs von Drittanbietern), die in mehreren Projekten in Ihrer Enterprise App verwendet werden. Normalerweise sind dies Klassen, die für mehrere EJBs und häufig auch ein einzelnes Webmodul verwendet werden. –

+0

Normalerweise versetze ich Hilfsprojekte nicht in einfache Java-Projekte, da bei den Hilfsprojekten die Laufzeit-JARs des Servers automatisch zum Klassenpfad hinzugefügt werden. Zum Beispiel könnte ich Datenquellen aus demselben Projekt verwenden, ohne die JARs des Containers zum Build-Pfad hinzuzufügen. –

10

Ich habe das herausgefunden, nachdem ich etwas Zeit damit verbracht habe. Wenn Sie sich in Eclipse Helios befinden, gehen Sie zu properties > deployment assembly > add > project und wählen Sie das abhängige Projekt aus, das Sie hinzufügen möchten.

+0

Mehr rechts und hilfreiche Antwort, wenn Sie nicht eine EAR verwenden. –