Tentative de modifier une application Java / Tomcat existante pour le déploiement sur Heroku à la suite de leur Didacticiel et rencontre des problèmes avec Appassembler ne trouvant pas la classe d'entrée. Cible / Bin / Bin / WebApp (ou déploiement sur Heroku) Résultats dans exécution Erreur: Impossible de trouver ou de charger la classe principale org.stopbadware.dsp.main code> cible / classes de Java -CP : cible / dépendance / * org.stopbadware.dsp.main code> fonctionne correctement. Voici la partie pertinente de POM.XML: P> <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<assembleDirectory>target</assembleDirectory>
<programs>
<program>
<mainClass>org.stopbadware.dsp.Main</mainClass>
<name>webapp</name>
</program>
</programs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
</plugin>
6 Réponses :
La première chose est que vous utilisez une ancienne version de Appassembler-Maven- Plugin La version actuelle est 1.3.
Ce que je ne comprends pas pourquoi définissez-vous le dossier P>
<configuration>
<useWildcardClassPath>true</useWildcardClassPath>
<repositoryLayout>flat</repositoryLayout>
...
</configruation>
C'était ma première expérience avec Appassembler, alors j'utilisais ce que Heroku avait mentionné précédemment dans le tutoriel. En utilisant 1.3, en supprimant les références de répertoire et d'exécution et l'ajout dans les options génériques n'a eu aucun effet, obtenant toujours la même erreur. Clairement, lorsque vous construisez le script, il ne crée pas la bonne classe de classe et tristement, la documentation Appassembler est assez limitée et ne semble pas indiquer comment ajouter explicitement à la classe générée.
Le meilleur est de mettre un exemple de projet (avec son pom.xml) sur Jira et créer un Émettez-moi ou envoyez-moi simplement le fichier pom.xml en privé afin que je puisse jeter un oeil à votre problème.
Vous pouvez voir le pom.xml at Pastebin.com/11WMJBMB - Le script généré par Appassembler est sur pastebin.com/f9gbvmgx et fonctionne une fois que l'entrée de la sélection / cible / classes manquante dans la classe de classe est corrigée en ajoutant " $ Basé sur "/ classes code>
a pu résoudre ceci en ajoutant Évidemment, un peu de hack, mais après plus de 8 heures de tentative de solution plus "appropriée", cela devra faire pour l'instant. Sera certainement divertir des moyens plus élégants de corriger le path de classe suggéré ici. P> "$ basé sur" / classes code> à la ligne de classePath dans le script généré. Étant donné que le script est réécrit sur chaque appel de MVN Package code> J'ai écrit un bref script qui appelle Package MVN code> puis ajoute l'entrée de classe de classe requise. P>
Essayez:
mvn clean package jar:jar appassembler:assemble
Cela fonctionne bien sur ma machine locale, mais pas une fois déployée à Heroku. D'après ce que je peux voir, il n'ya aucun moyen de modifier la commande Maven de Heroku de sa valeur par défaut de MVN Clean Installe Code> (Ajouter JAR: JAR Appassembler: Assemblez Code> à Maven_opts n'avait aucun effet).
L'emballage de votre artefact doit être défini sur JAR code>, sinon la classe principale n'est pas trouvée. <pom>
...
<packaging>jar</packaging>
...
</pom>
Vous pouvez définir le Variable d'environnement de classePath_prefix :
export CLASSPATH_PREFIX=target/classes
Je traversais ce tutoriel il y a quelque temps et j'avais un problème très similaire. Je suis venu avec une approche peu différente qui travaille pour moi très bien.
Tout d'abord, comme il a été mentionné précédemment, vous devez garder le type de votre POM comme Veuillez noter que ce tutoriel Tomcat est instancié à partir du répertoire de source d'applications. Dans de nombreux cas, c'est suffisant, mais veuillez noter que l'utilisation de cette approche, vous ne pourrez utiliser pas d'utiliser le servlet J'ai fait une approche bit différente: p > i Exécutez un J'ai également dû modifier une source de ma candidature dans la classe de lanceur: P> JAR code> ( Appassembler code> générera un fichier JAR de vos classes et l'ajoutez à la classe de classe. Donc, grâce à cela que votre erreur disparaîtra. P> @webservlet code> annotations comme / web-inf / classes code> dans les sources est Vide et Tomcat ne pourra pas numériser vos classes de servlet. Donc HelloServlet Code> Server de ce didacticiel ne fonctionnera pas, à moins que vous ajoutez une initialisation de Tomcat supplémentaire (configuration de ressources) comme décrit ici (BTW, vous trouverez plus de questions à parler de cette configuration de ressources). P> org.apache.maven.plugins: plugin maven-war-plugin code> plugin ( explosé code> but) pendant package code> et utilisation Ce répertoire généré comme mon répertoire source d'application. Avec cette approche, mon répertoire d'applications Web aura / web-inf / classes code> "peuplé" avec des classes. Cela permettra à son tour d'effectuer le travail de numérisation correctement (c.-à-d. Serverlet @webservlet code> fonctionnera). P> ...
<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>
...
Pouvez-vous montrer comment le script généré (.sh / .bat) ressemble?
Le script généré peut être vu sur Pastebin.com/f9GBVMGX - La classe principale non trouvée est dans ProjectRoot / SRC / org / stopbadware / dsp /