7
votes

Maven Appassembler ne trouve pas de classe

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 Erreur: Impossible de trouver ou de charger la classe principale org.stopbadware.dsp.main code>

exécution 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>


2 commentaires

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 /


6 Réponses :


1
votes

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>


3 commentaires

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



1
votes

a pu résoudre ceci en ajoutant "$ basé sur" / classes à la ligne de classePath dans le script généré. Étant donné que le script est réécrit sur chaque appel de MVN Package J'ai écrit un bref script qui appelle Package MVN puis ajoute l'entrée de classe de classe requise.

É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.


0 commentaires

3
votes

Essayez:

mvn clean package jar:jar appassembler:assemble


1 commentaires

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 (Ajouter JAR: JAR Appassembler: Assemblez à Maven_opts n'avait aucun effet).



6
votes

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>


0 commentaires

1
votes

Vous pouvez définir le Variable d'environnement de classePath_prefix :

export CLASSPATH_PREFIX=target/classes


0 commentaires

1
votes

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 JAR code> ( JAR EMBALLAGE> CODE>) - Grâce à cela, 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>

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 @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>

J'ai fait une approche bit différente: p >

i Exécutez un 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>

J'ai également dû modifier une source de ma candidature dans la classe de lanceur: 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>
...


0 commentaires