Comment faire pour exécuter une classe de Pot qui n'est pas le Principal de la Classe dans son fichier de Manifeste
J'ai un POT avec 4 classes, chacun a la méthode Principale. Je veux être en mesure d'exécuter chacune de celles-ci comme par la nécessité. Je suis en train de l'exécuter à partir de la ligne de commande sur Linux.
E.g. The name of my JAR is MyJar.jar
Il a la structure de répertoire pour les principales classes comme suit:
com/mycomp/myproj/dir1/MainClass1.class
com/mycomp/myproj/dir2/MainClass2.class
com/mycomp/myproj/dir3/MainClass3.class
com/mycomp/myproj/dir4/MainClass4.class
Je sais que je peux spécifier une classe en tant que principal dans mon fichier de Manifeste. Mais est-il un moyen par lequel je peux spécifier un argument sur la ligne de commande à exécuter selon la classe je souhaite exécuter?
J'ai essayé ceci:
jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt
Et j'ai eu cette erreur:
com/mycomp/myproj/dir2/MainClass2.class : no such file or directory
(Dans la commande ci-dessus, '/home/myhome/source de données.propriétés' et '/home/myhome/input.txt " les arguments de ligne de commande).
- Juste à les emballer dans différents pots, en utilisant un autre pot pour contenir les dépendances?
- Pourquoi ne pas avoir une seule classe principale qui appelle la méthode spécifique(sur les 4) sur base d'arguments de ligne de commande?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer votre bocal sans Principal de la Classe dans son fichier de Manifeste. Alors :
Vous pouvez exécuter tout classe qui a un
public final static main
méthode à partir d'un fichier JAR, même si le fichier jar est unMain-Class
défini.Exécuter Main-Class:
Exécuter une autre classe avec un
public static void main
méthode:Remarque: la première utilise
-jar
, la seconde utilise-cp
.java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
Notez les guillemets autour de./*
la prévention des machines unix de l'élargir. Notez également que"./*.jar"
ne fonctionnera pas.En dehors de l'appel de
java -jar myjar.jar com.mycompany.Myclass
, vous pouvez également faire la classe principale dans votre Manifeste une classe Dispatcher.Exemple:
Tout d'abord
jar
crée un bocal, et de ne pas l'exécuter. Essayezjava -jar
à la place.Deuxième, pourquoi pensez-vous passer à la classe deux fois, comme FQCN (
com.mycomp.myproj.dir2.MainClass2
) et sous forme de fichier (com/mycomp/myproj/dir2/MainClass2.class
)?Edit:
Il me semble que si
java -jar
nécessite une classe principale doit être spécifié. Vous pouvez essayer dejava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
à la place.-cp
définit le jar dans le classpath et permet de java pour rechercher le principal de classe là.Une autre option que je pense que Nick a brièvement fait mention dans les commentaires est de créer plusieurs wrapper pots. Je n'ai pas essayé, mais je pense qu'ils pourraient être complètement vide à l'autre que le fichier de manifeste, qui doit préciser la classe principale à charge ainsi que l'inclusion de la MyJar.jar pour le classpath.
MyJar1.jar\META-INF\MANIFESTE.MF
MyJar2.jar\META-INF\MANIFESTE.MF
etc.
Alors juste l'exécuter avec
java -jar MyJar2.jar
Ajouter en dessous de plugin dans votre pom.xml fichier et spécifiez la Classe Principale avec le nom complet de l'élément.