Ich war vor einiger Zeit durch dieses Tutorial gegangen und hatte sehr ähnliches Problem. Ich kam mit einem etwas anderen Ansatz, der für mich sehr gut funktioniert.
Zunächst einmal, wie es vorher erwähnt wurde, müssen Sie Ihre POM Typen als jar
(<packaging>jar</packaging>
) halten - dank, dass, wird appassembler
Plugin eine JAR-Datei von Ihren Klassen erzeugen und es zu dem Classpath hinzufügen. Also, damit wird dein Fehler verschwinden.
Bitte beachten Sie, dass dieses Tutorial Tomcat aus dem Quellverzeichnis der Anwendung instanziiert wird. In vielen Fällen ist das ausreichend, aber beachten Sie bitte, dass Sie mit diesem Ansatz Servlet @WebServlet
Annotationen nicht verwenden können, da /WEB-INF/classes
in Quellen leer ist und Tomcat Ihre Servlet-Klassen nicht scannen kann. So HelloServlet
Servlet von diesem Tutorial wird nicht funktionieren, es sei denn, Sie fügen einige zusätzliche Tomcat-Initialisierung (Ressourcenkonfiguration) wie beschrieben here (BTW, finden Sie mehr SO Fragen sprechen über diese Ressource Konfiguration).
Ich habe ein bisschen anderen Ansatz:
Ich betreibe ein org.apache.maven.plugins:maven-war-plugin
Plugin (exploded
Ziel) während package
und Verwendung, das Verzeichnis als meine Quellverzeichnis-Anwendung generiert. Mit diesem Ansatz wird mein Webanwendungsverzeichnis /WEB-INF/classes
mit Klassen "aufgefüllt". Dies wiederum ermöglicht es Tomcat, den Scan-Job korrekt auszuführen (d. H. Servlet @WebServlet
Annotationen funktionieren).
Ich musste auch eine Quelle für meine Anwendung in der Klasse Launcher ändern:
public static void main(String[] args) throws Exception {
// Web application is generated in directory name as specified in build/finalName
// in maven pom.xml
String webappDirLocation = "target/embeddedTomcatSample/";
Tomcat tomcat = new Tomcat();
// ... remaining code does not change
Änderungen an POM, die ich hinzugefügt - maven-war-plugin
vor appassembler
Plugin nur enthalten:
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
</plugin>
...
Bitte beachten Sie, dass exploded
Ziel heißt.
Ich hoffe, dass kleine Änderungen Ihnen helfen werden.
Ein weiterer Kommentar zu diesem Tutorial und Maven Build: beachten Sie, dass das Tutorial zu zeigen, geschrieben wurde, wie einfach ist es, eine Anwendung zu erstellen und sie in Heroku laufen. Dies ist jedoch nicht der beste Ansatz zur Erstellung von Maven.
Die Empfehlung von Maven ist, dass Sie sich daran halten sollten, ein Artefakt pro POM herzustellen. In Ihrem Fall gibt es sollte zwei Artefakte:
- Tomcat Launcher
- Tomcat Web-Anwendung
Beide sollten als separaten POMs und verwies als Module aus Ihren Eltern POM sein zu bauen. Wenn Sie sich die Komplexität dieses Tutorials anschauen, ist es nicht sinnvoll, das in zwei Module aufzuteilen. Wenn Ihre Anwendungen jedoch immer komplexer werden (und der Launcher einige zusätzliche Konfigurationen usw. erhält), wird es sehr sinnvoll sein, diesen "Split" zu machen. In der Tat, es gibt einige "Tomcat Launcher" -Bibliotheken, die bereits erstellt wurden, so dass Sie alternativ eine davon verwenden könnten.
Können Sie zeigen, wie das generierte Skript (.sh/.bat) aussieht? – khmarbaise
Das generierte Skript kann unter http://pastebin.com/f9gbVMgx eingesehen werden - die Main-Klasse, die nicht gefunden wird, befindet sich in PROJECTROOT/src/org/stopbadware/dsp/ – Exupery