J'ai un JAR avec 4 classes, chacune a la méthode principale. Je veux être en mesure d'exécuter chacun de ceux-ci selon les besoins. J'essaye de l'exécuter à partir de la ligne de commande sur la boîte Linux.
E.g. The name of my JAR is MyJar.jar
Il a la structure de répertoires pour les classes principales 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 comme principale dans mon fichier Manifest. Mais y a-t-il un moyen par lequel je peux spécifier un argument sur la ligne de commande pour exécuter la classe que 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/datasource.properties» et «/home/myhome/input.txt» sont les arguments de ligne de commande).
java
jar
executable-jar
Bhushan
la source
la source
Réponses:
Vous pouvez créer votre fichier JAR sans Main-Class dans son fichier Manifest. Ensuite :
la source
Vous pouvez exécuter une classe qui a une
public final static main
méthode à partir d' un fichier JAR, même si le fichier jar a unMain-Class
défini .Exécuter la classe principale:
Exécutez une autre classe avec une
public static void main
méthode:Remarque: le premier utilise
-jar
, le second utilise-cp
.la source
java -cp "./*" com.mycomp.myproj.AnotherClassWithMainMethod
Notez les guillemets doubles pour./*
empêcher les machines Unix de l'étendre. Notez également que"./*.jar"
cela ne fonctionnera pas.Outre l'appel
java -jar myjar.jar com.mycompany.Myclass
, vous pouvez également faire de la classe principale de votre Manifest une classe Dispatcher.Exemple:
la source
Cette réponse est pour les utilisateurs de Spring-boot:
Si votre JAR provient d'un
Spring-boot
projet et a été créé à l'aide de la commandemvn package spring-boot:repackage
, la méthode "-cp" ci-dessus ne fonctionnera pas. Tu auras:même si vous pouvez voir la classe dans le JAR par
jar tvf yours.jar
.Dans ce cas, exécutez votre classe alternative par la commande suivante:
Comme je l'ai compris, la
org.springframework.boot.loader.PropertiesLauncher
classe de Spring-boot sert de classe d'entrée de répartition, et le-Dloader.main
paramètre lui dit quoi exécuter.Référence: https://github.com/spring-projects/spring-boot/issues/20404
la source
Tout d'abord
jar
crée un pot et ne l'exécute pas. Essayez à lajava -jar
place.Deuxièmement, pourquoi passez-vous la classe deux fois, en tant que FQCN (
com.mycomp.myproj.dir2.MainClass2
) et en tant que fichier (com/mycomp/myproj/dir2/MainClass2.class
)?Éditer:
Il semble que cela
java -jar
nécessite la spécification d'une classe principale. Vous pouvez essayer à lajava -cp your.jar com.mycomp.myproj.dir2.MainClass2 ...
place.-cp
définit le fichier jar sur le chemin de classe et permet à java d'y rechercher la classe principale.la source
Une autre option similaire à laquelle je pense que Nick a brièvement fait allusion dans les commentaires est de créer plusieurs pots wrapper. Je ne l'ai pas essayé, mais je pense qu'ils pourraient être complètement vides à part le fichier manifeste, qui devrait spécifier la classe principale à charger ainsi que l'inclusion de MyJar.jar dans le classpath.
MyJar 1 .jar \ META-INF \ MANIFEST.MF
MyJar 2 .jar \ META-INF \ MANIFEST.MF
etc. Ensuite, lancez-le simplement avec
java -jar MyJar2.jar
la source
Ajoutez le plugin ci-dessous dans votre fichier pom.xml et spécifiez la classe principale avec le nom complet dans l'élément.
la source