J'ai deux classes principales dans l'application. Lorsque je le conditionne dans un pot exécutable (en utilisant la fonction d'exportation Eclipse), je dois sélectionner une classe principale par défaut.
Existe-t-il un moyen d'accéder à la classe principale non par défaut à partir du bocal au moment de l'exécution?
Vous pouvez accéder aux deux via Java -cp myapp.jar com.example.Main1
et Java -cp myapp.jar com.example.Main2
. La classe principale par défaut dans le bocal est lorsque vous appelez votre application via Java -jar myapp.jar
.
Voir JAR_ (file_format) pour plus de détails. Lorsque vous sélectionnez la classe principale dans Eclipse, voici ce qui est défini dans: Main-Class: myPrograms.MyClass
à l'intérieur du manifeste du pot META-INF/MANIFEST.MF
à côté du fichier jar.
Oui c'est possible. Vous pouvez sous chacun ajouter une autre classe avec une méthode principale pour celle qui exécute la classe/méthode souhaitée en fonction de l'argument.
Par exemple.
public static void main(String... args) {
if ("foo".equals(args[0])) {
Foo.main(args);
} else if ("bar".equals(args[0])) {
Bar.main(args);
}
}
(n'oubliez pas d'ajouter vous-même les vérifications évidentes telles que args.length
et ainsi de suite)
Que vous pouvez utiliser comme suit:
Java -jar YourJar.jar foo
Si elle est bien conçue, cela peut cependant rendre superflue la méthode main()
des autres classes. Par exemple.
public static void main(String... args) {
if ("foo".equals(args[0])) {
new Foo().execute();
} else if ("bar".equals(args[0])) {
new Bar().execute();
}
}
Pour résumer cela davantage (pour se débarrasser des blocs if/else), vous pourriez envisager de les laisser implémenter une interface Action
avec une void execute()
et de les récupérer dans un Map
:
private static Map<String, Action> actions = new HashMap<String, Action>();
static {
actions.put("foo", new Foo());
actions.put("bar", new Bar());
}
public static void main(String... args) {
actions.get(args[0]).execute();
}