Ich arbeite an einer einfachen JSP/Servlet/Tomcat-Webapp für meine Klasse. Der Professor bat uns, eine Ordnerstruktur zu verwenden, die sich geringfügig von der standardmäßigen dynamischen Webprojektstruktur unterscheidet. Statt den Ordner webcontent zu verwenden, möchte er den gesamten Quellcode unter src/main/Java und src/main/webapp verwenden.
Wenn ich die App starte, wird meine Begrüßungsdatei angezeigt. Wenn ich jedoch auf meine Servlets zugreifen möchte, erhalte ich Folgendes:
Http 500 SEVERE: Allocate exception for servlet InitDb
Java.lang.ClassNotFoundException. Ich bin mir ziemlich sicher, dass es ein Fehler beim Build-Pfad ist. Ich habe final/src auf dem Build-Pfad, aber ich erhalte die Warnung
"Cannot nest 'final/src/main/webapp/WEB-INF/classes' inside 'final/src'. To enable the nesting exclude 'main/' from 'final/src'
Ich habe dies in meiner Deployment Assembly:
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
Wenn ich main ausschließe, verschwindet die Warnung, aber das Problem ist nicht behoben. Ich würde mich über einen Rat freuen. Vielen Dank.
Ich hatte das gleiche Problem, als ich ein neues Projekt erstellte. Ich habe das Java-Projekt in Eclipse erstellt, dann mavenize es erstellt, dann in die Java-Build-Pfadeigenschaften gegangen, src/
entfernt und src/main/Java
und src/test/Java
hinzugefügt. Beim Ausführen von Maven-Update wurde ein verschachtelter Pfadfehler angegeben.
Dann wurde mir endlich klar - weil ich diesen Eintrag vorher nicht gesehen hatte- es gibt eine <sourceDirectory>src</sourceDirectory>
-Zeile in der pom-Datei, die geschrieben wird, wenn ich es maveniere. Es wurde nach dem Entfernen behoben.
Ich wollte eine nicht-freche Antwort auf diesen Thread einbringen.
Aus Gründen der Versionskontrolle und der strengen Verzeichnisstruktur konnte ich Acherons Antwort (der besten Antwort) nicht folgen, indem ich etwas ähnliches tat, wie src/
zu entfernen und src/main/Java
und src/test/Java
zum Buildpfad hinzuzufügen.
Ich hatte tatsächlich ein paar Wochen lang mit diesem Problem des verschachtelten Baupfads gekämpft. Die Antwort auf das Problem finden Sie in der Fehlermeldung:
To enable the nesting exclude 'main/' from 'final/src'
Fix
In Ihrem Build-Pfad müssen Sie Ihren Inclusion and Exclusion Patterns
bearbeiten, indem Sie auf Excluded: (None)
und dann auf Edit...
klicken:
Dort können Sie main/webapp/WEB-INF/classes
als Exclusion Pattern
hinzufügen. Dann sollte es möglich sein, main/webapp/WEB-INF/classes
als separaten Quellordner zum Build-Pfad hinzuzufügen.
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 zurück in:
click "Add Library" -> click to highlight "Web App Libraries" -> click "next" -> confirm your desired project is the selected option -> click "Finish"
"Web-App-Bibliotheken" hervorheben:
Ich hatte das gleiche Problem und die richtige Antwort funktionierte nicht für mich. Was ich tat, um das Problem zu beheben, war, zu Build Path->Configure Build Path
zu gehen, und unter der Registerkarte "Quelle" habe ich alle Quellen (die nur eine Quelle hatten) entfernt und von dort neu konfiguriert. Am Ende entfernte ich das Projekt aus Eclipse und importierte das Maven-Projekt erneut, um den Fehler zu beheben.
Sie müssen Ihre Quellen und Ihr Zielverzeichnis, in das die Build-Ausgabe geht, voneinander trennen. Es ist auch wichtig zu beachten, dass keine Klassendateien im Quellverzeichnis enden 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 WEB-INF/web.xml-Datei, aber Sie werden niemals tatsächliche Klassen dort ablegen.
Was Sie ändern müssen, ist Ihr Zielverzeichnis. Ich schlage vor, nach den gleichen Standards zu gehen und dafür den Namen "./target" zu wählen. Alle erstellten Dateien werden hier eingefügt, und wenn Sie diese zusammenstellen, erhalten Sie ein korrektes bereitbares Artefakt. Wenn Sie später auf maven umsteigen, hilft dies auch auf geskriptete, wiederholbare Weise.
Hoffe das klärt dein Problem.
Die akzeptierte Lösung hat für mich nicht funktioniert, aber ich habe die Projekteinstellungen etwas durchgearbeitet.
Die folgende Lösung hat es für mich zumindest behoben, WENN Sie ein dynamisches Webprojekt verwenden:
Sie sollten in der Lage sein, src/main/Java hinzuzufügen. Es fügt es automatisch zur Bereitstellungsassembly hinzu.
Vorsichtsmaßnahme: Wenn Sie eine src/test/Java-Notiz hinzugefügt haben, wird sie auch zur Deployment Assembly hinzugefügt. Im Allgemeinen brauchen Sie das nicht. Sie können es entfernen.
In meinem Fall habe ich ein gradle nature Projekt in Eclipse , das Problem war in einem build.gradle
, wo diese sourceSets
angegeben ist:
sourceSets {
main {
Java {
srcDir 'src'
}
}
}
Dies scheint gut mit intelliJ zu funktionieren, scheint jedoch als Eclipse das Nest src
, src/Java
, src/resources
nicht zu mögen. In Eclipse muss ich es ändern in:
sourceSets {
main {
Java {
srcDir 'src/main/Java'
}
}
}
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 das Problem lösen, da sich das Build-Verzeichnis jetzt nicht mehr im Java-Quellordner befindet.
Dies führte dazu, dass ich ein riesiges Kaninchenloch mit Eclipse beseitigte, das Problem wurde jedoch von Eclipse gelöscht und neu importiert, um es zu reparieren.
Hier ist eine einfache Lösung: