web-dev-qa-db-fra.com

Sélection de la classe principale dans un pot exécutable au moment de l'exécution

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?

29
Tomasz

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.

44
Jeremy Raymond

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();
}
8
BalusC