Ho seguito quel tutorial un po 'di tempo fa e ho riscontrato un problema molto simile. Sono venuto con un approccio un po 'diverso che funziona per me molto bene.
Prima di tutto, come è stato accennato prima, è necessario mantenere il tipo del vostro POM come jar
(<packaging>jar</packaging>
) - grazie a ciò, appassembler
plugin genererà un file JAR dalle classi e aggiungerlo al classpath. Quindi grazie a ciò il tuo errore andrà via.
Si prega di notare che questo tutorial Tomcat è un'istanza dalla directory di origine delle applicazioni. In molti casi è sufficiente, ma tieni presente che utilizzando tale approccio, non sarai in grado di utilizzare le annotazioni Servlet @WebServlet
come /WEB-INF/classes
nelle origini è vuoto e Tomcat non sarà in grado di eseguire la scansione delle classi servlet. Quindi il servlet HelloServlet
da questo tutorial non funzionerà, a meno che non si aggiunga un'inizializzazione di Tomcat aggiuntiva (configurazione delle risorse) come descritto in here (a proposito, troverai altre domande SO che parlano della configurazione di tale risorsa).
ho fatto un po 'diverso approccio:
Ho eseguito una org.apache.maven.plugins:maven-war-plugin
plug-in (exploded
gol) durante package
e l'uso che ha generato directory come la mia fonte di directory di applicazione. Con questo approccio la mia directory di applicazioni web avrà "popolato" /WEB-INF/classes
con le classi. Ciò a sua volta consentirà a Tomcat di eseguire correttamente il lavoro di scansione (vale a dire che le annotazioni servlet @WebServlet
funzioneranno).
ho anche dovuto cambiare una fonte della mia applicazione nella classe launcher:
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
Modifiche a POM che ho aggiunto - incluso maven-war-plugin
poco prima appassembler
plugin:
...
<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>
...
prega di notare che L'obiettivo exploded
viene chiamato.
Spero che questo piccolo cambiamento ti possa aiutare.
più Un commento su questo tutorial e Maven costruzione: notare che il tutorial è stato scritto per mostrare come semplice è quello di costruire un'applicazione ed eseguirlo in Heroku. Tuttavia, questo non è l'approccio migliore per costruire Maven.
La raccomandazione di Maven è che si dovrebbe aderire alla produzione di un artefatto per POM. Nel tuo caso ci sono due dovrebbero manufatti:
- Tomcat launcher
- Tomcat applicazione web
Entrambi dovrebbero essere costruire POMs come separati e fatto riferimento come i moduli da un genitore POM. Se si guarda alla complessità di quel tutorial, non ha molto senso dividerlo in due moduli. Ma se le tue applicazioni diventano sempre più complesse (e il programma di avvio ottiene alcune configurazioni aggiuntive, ecc.) Sarà molto sensato rendere questa "divisione". In effetti, ci sono alcune librerie "di avvio Tomcat" già create in modo alternativo che potresti usare una di esse.
Puoi mostrare come appare lo script generato (.sh/.bat)? – khmarbaise
Lo script generato può essere visto su http://pastebin.com/f9gbVMgx - la classe Main che non è stata trovata è in PROJECTROOT/src/org/stopbadware/dsp/ – Exupery