J'ai une classe Java qui a une méthode principale et que j'avais l'habitude d'exécuter en tant qu'application autonome à partir de la ligne de commande, par exemple.
java -jar monjar.jar params
J'ai dû reconditionner le code pour qu'il s'exécute sous Apache et tout mon code, y compris la classe du point d'entrée de l'ancien jar, s'est retrouvé dans un fichier WAR pour un déploiement facile sur le serveur web.
Cependant, je veux toujours être capable de l'exécuter à partir de la ligne de commande et le code n'a pas changé et est toujours là, je n'arrive juste pas à trouver comment le faire fonctionner.
Voici ce que j'ai essayé...
Je pensais que le WAR était juste comme un jar, donc
java -jar monwar.war params
Cela a échoué en indiquant qu'aucune classe principale n'était définie dans le manifeste.
J'ai ajouté manuellement un manifeste au war et essayé à nouveau, avec le même effet.
J'ai remarqué que dans mon war j'avais un dossier appelé META-INF contenant un manifest.mf, donc j'ai ajouté une ligne déclarant ma classe principale comme je le ferais pour un manifeste normal...
Manifest-Version: 1.0
Main-Class: mypackage.MyEntryPointClass
Cela a donné une noClassDefFoundError mypackage.MyEntryPointClass
, ce qui est un progrès en quelque sorte. Cela m'a amené à penser que c'était juste un problème de chemin, donc j'ai essayé
Manifest-Version: 1.0
Main-Class: WEB-INF.classes.mypackage.MyEntryPointClass
J'obtiens maintenant la même erreur, mais avec une trace de pile...
Exception in thread "main" java.lang.NoClassDefFoundError: WEB-INF/classes/mypackage/MyEntryPointClass (wrong name: mypackage/MyEntryPointClass)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
J'ai fait des recherches sur Google mais je n'ai rien trouvé qui réponde à ma question, et j'ai lu quelques autres questions ici qui sont légèrement différentes, donc j'ai pensé que je posterais.
Java 1.5, pas que je pense que cela devrait faire une différence.
1 votes
N'ai pas essayé cela, mais que diriez-vous d'ajouter une entrée 'Class-Path' au manifeste?
0 votes
Avez-vous des raisons pour cela? Pourquoi ne pas essayer de garder deux assemblages différents - un pour le web et un comme une application autonome?
0 votes
Avez-vous essayé de mettre un classpath dans le manifest.mf qui avait WEB-INF/classes et de laisser Main-Class comme mypackage.MyEntryPointClass ?
0 votes
Essayé l'idée du classpath, cela n'a pas fonctionné
0 votes
@Andrew, Je pourrais avoir deux packages différents, mais cela semble simplement gaspiller quand le contenu de l'un est un sur-ensemble du contenu de l'autre