Verschachtelungsfehler beim Erstellen von Eclipse-Pfaden

122

Ich arbeite an einer einfachen JSP / Servlet / Tomcat-Webanwendung für meine Klasse. Der Professor bat uns, eine Ordnerstruktur zu verwenden, die sich geringfügig von der dynamischen Standard-Webprojektstruktur unterscheidet. Anstatt den Ordner webcontent zu verwenden, möchte er unseren gesamten Quellcode unter src / main / java und src / main / webapp.

Wenn ich die App starte, wird meine Begrüßungsdatei einwandfrei angezeigt. Wenn ich jedoch versuche, auf meine Servlets zuzugreifen, wird Folgendes angezeigt:

 Http 500 SEVERE: Allocate exception for servlet InitDb

java.lang.ClassNotFoundException. Ich bin mir ziemlich sicher, dass es sich um einen Build-Pfad-Fehler handelt. Ich habe final / src auf dem Erstellungspfad, erhalte aber die Warnung

"Cannot nest 'final/src/main/webapp/WEB-INF/classes' inside 'final/src'. To enable the    nesting exclude 'main/' from 'final/src'

Geben Sie hier die Bildbeschreibung ein

Ich habe dies in meiner Bereitstellungsassembly:

<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/> 

Wenn ich main / ausschließe, verschwindet die Warnung, aber das Problem wird dadurch nicht behoben. Ich würde mich über jeden Rat freuen. Vielen Dank.

Everhill
quelle

Antworten:

309

Ich hatte das gleiche Problem, selbst als ich ein neues Projekt erstellte. Ich habe das Java-Projekt in Eclipse erstellt, es dann mavenisiert und dann die Eigenschaften des Java-Erstellungspfads entfernt src/und src/main/javaund entfernt src/test/java. Wenn ich das Maven-Update ausführe, wird ein verschachtelter Pfadfehler ausgegeben.
Dann wurde mir endlich klar - weil ich diesen Eintrag vorher noch nicht gesehen hatte -, dass eine <sourceDirectory>src</sourceDirectory>Zeile in der POM-Datei geschrieben ist, wenn ich sie mavenisiere. Es wurde behoben, nachdem es entfernt wurde.

acheron55
quelle
1
Dies ist nur einer der vielen zufälligen Tricks. Nicht erklären warum. Also weniger hilfreich.
Smwikipedia
4
Ich habe gerade den POM-Eintrag in scr / main / java umbenannt und alles war gut. Vielen Dank für den Beitrag acheron55
Beezer
Hast du es dort hingelegt? oder woher kommt es
Linie
23

Ich wollte eine nicht-mavenische Antwort auf diesen Thread geben.

Aufgrund der Versionskontrolle und strenger Gründe für die Verzeichnisstruktur konnte ich Acherons Antwort (die beste Antwort) nicht folgen, etwas Ähnliches wie Entfernen src/und Hinzufügen src/main/javaund src/test/javazum Erstellungspfad zu tun .

Ich hatte tatsächlich ein paar Wochen lang immer wieder gegen dieses Problem mit verschachtelten Build-Pfaden gekämpft. Die Antwort auf das Problem ist in der Fehlermeldung angegeben:

To enable the nesting exclude 'main/' from 'final/src'

Fix

In Ihrem Erstellungspfad müssen Sie Ihren bearbeiten, Inclusion and Exclusion Patternsindem Sie auf Excluded: (None)und dann klicken Edit...:

  1. Gehen Sie zum Navigator und klicken Sie mit der rechten Maustaste auf das Projekt
  2. Pfad erstellen
  3. Konfigurieren Sie den Erstellungspfad
  4. Quelle (Registerkarte)

Ausschlussmuster

Dort können Sie main/webapp/WEB-INF/classesals hinzufügen Exclusion Pattern. Anschließend sollten Sie main/webapp/WEB-INF/classesdem Erstellungspfad einen separaten Quellordner hinzufügen können .

heez
quelle
10

Versuche dies:

Auf der Registerkarte Bibliotheken:

Eclipse -> right click on project name in sidebar -> configure build path -> Libraries

Entfernen Sie Ihre Web-App-Bibliotheken:

click on "Web App Libraries" -> click "remove"

Fügen Sie sie wieder hinzu in:

click "Add Library" -> click to highlight "Web App Libraries" -> click "next" -> confirm your desired project is the selected option -> click "Finish"

Hervorheben von "Web App Libraries":

Hervorheben von "Web App-Bibliotheken"

Sireesh Yarlagadda
quelle
3

Ich hatte das gleiche Problem und die richtige Antwort oben hat bei mir nicht funktioniert. Um das Problem zu beheben, habe Build Path->Configure Build Pathich alle Quellen (die nur eine Quelle hatten) entfernt und unter der Registerkarte "Quelle" entfernt und von dort aus neu konfiguriert. Am Ende habe ich das Projekt aus Eclipse entfernt und das Maven-Projekt erneut importiert, um den Fehler zu beheben.

Hatem Jaber
quelle
3

In meinem Fall habe ich ein Gradle-Natur-Projekt in Eclipse , das Problem war in a build.gradle, wo dies sourceSetsangegeben ist:

sourceSets {
    main {
        java {
            srcDir 'src'
        }
    }
 }

Das scheint gut funktioniert mit IntelliJ , scheint jedoch als Eclipse nicht wie Nest src, src/java, src/resources. In Eclipse muss ich es ändern in:

sourceSets {
    main {
        java {
            srcDir 'src/main/java'
        }
    }
}
Albciff
quelle
2

Sie müssen Ihre Quellen und Ihr Zielverzeichnis trennen, in das die Build-Ausgabe verschoben wird. Es ist auch wichtig zu beachten, dass keine Klassendateien jemals im Quellverzeichnis landen können. Dies ist nicht gegen den Rat Ihres Professors - tatsächlich fördert er die Standard-Quellstruktur von Maven für ./src/main/java und ./src/main/webapp. Der zweite sollte zB halten. die obligatorische Datei WEB-INF / web.xml, aber Sie werden dort niemals tatsächliche Klassen ablegen.

Was Sie ändern müssen, ist Ihr Zielverzeichnis. Ich schlage vor, die gleichen Standards zu verwenden und dafür den Namen "./target" zu wählen. Alle erstellten Dateien werden hier gespeichert, und das Packen führt zu einem korrekten bereitstellbaren Artefakt. Wenn Sie später auf die Verwendung von maven migrieren, hilft dies auch dabei, dies in einer skriptbasierten, wiederholbaren Weise zu tun.

Hoffe, das klärt dein Problem.

Kristof Jozsa
quelle
2

Hier ist eine einfache Lösung:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt >> Eigenschaften >> Erstellungspfad.
  2. Wählen Sie auf der Registerkarte Quelle alle Quellordner aus.
  3. Entferne sie;
  4. Klicken Sie mit der rechten Maustaste auf Projekt, Maven >> Aktualisieren Sie das Projekt.
abhijeet104
quelle
1

Die akzeptierte Lösung hat bei mir nicht funktioniert, aber ich habe einige Projekteinstellungen vorgenommen.

Die folgende Lösung hat es zumindest für mich behoben, wenn Sie ein dynamisches Webprojekt verwenden:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt und dann auf Eigenschaften. (oder Alt-Enter für das Projekt)
  2. Entfernen Sie unter Deployment Assembly "src".

Sie sollten in der Lage sein, src / main / java hinzuzufügen. Außerdem wird es automatisch zur Bereitstellungsassembly hinzugefügt.

Vorsichtsmaßnahme: Wenn Sie eine src / test / java-Notiz hinzugefügt haben, wird diese auch zur Deployment Assembly hinzugefügt. Im Allgemeinen brauchen Sie das nicht. Sie können es entfernen.

Tschad
quelle
1

Dies führte mich in ein riesiges Kaninchenloch, in dem Störungen mit Eclipse behoben wurden. Ich habe das Projekt jedoch gerade aus Eclipse gelöscht und es erneut importiert, um es zu beheben.

Carson
quelle
0

Damit der Eclipse-Compiler ordnungsgemäß funktioniert, müssen Sie final / src aus dem Quellpfad entfernen und stattdessen final / src / main / java hinzufügen. Dies kann auch Ihr Problem lösen, da sich das Build-Verzeichnis jetzt nicht mehr im Java-Quellordner befindet.

Sasha O.
quelle
0

STS IDE

Es hängt davon ab, zu welchem ​​Ordner man "Als Quellordner verwenden" sagt. Wenn man es in der Struktur auf dem Bild zum Ordner "Ziel" oder "Erzeugt" sagt, erhält man den Fehler "verschachtelt". Aber auf dem Ordner "cxf", der der letzte ist, der im Abschnitt "Plugin" der pom.xml erwähnt wird und wo die Paketstruktur beginnt (wie in der .wsdl-Datei gezeigt), dh - der richtige Ordner, um dies zu tun, "Quell" , dann liegt kein Fehler vor

yrz
quelle
0

Habe ein ähnliches Problem. Wurden folgende Schritte ausgeführt, Problem behoben:

  1. Projekt in Eclipse entfernen.
  2. Löschen Sie die Projektdatei und. Einstellungsordner.
  3. Importieren Sie das Projekt erneut als vorhandenes Maven-Projekt in Eclipse.
Weg
quelle
-3

Erstellen Sie zwei Ordner: final/src/zum Speichern des Java-Quellcodes und final/WebRoot/ .

Sie können die Quelle und die Webroot nicht zusammenfügen. Ich denke, Sie könnten Ihren Lehrer falsch verstehen.

Jimmy Zhang
quelle