2010-01-07 6 views

Antwort

43

Sie können beide über java -cp myapp.jar com.example.Main1 und java -cp myapp.jar com.example.Main2 erreichen. Die Standardhauptklasse im Jar ist, wenn Sie Ihre App über java -jar myapp.jar aufrufen.

Weitere Details finden Sie unter JAR_(file_format). Wenn Sie die Hauptklasse in Eclipse auswählen, wird Folgendes festgelegt: Main-Class: myPrograms.MyClass innerhalb des JAR-Manifests META-INF/MANIFEST.MF in der JAR-Datei.

+0

Dies funktioniert nicht mit dem ausführbaren Eclipse-Export, da sie das Laden an einen benutzerdefinierten Classloader delegieren. –

+4

Dies funktioniert nicht, wenn Sie das Class-Path-Attribut haben –

8

Ja, es ist möglich. Sie können unter jedem eine weitere Klasse mit einer Hauptmethode hinzufügen, die die gewünschte Klasse/Methode basierend auf dem Argument ausführt.

z.

public static void main(String... args) { 
    if ("foo".equals(args[0])) { 
     Foo.main(args); 
    } else if ("bar".equals(args[0])) { 
     Bar.main(args); 
    } 
} 

(nicht zu vergessen die offensichtlichen Kontrollen hinzuzufügen du wie args.length usw.)

Welche Sie wie folgt verwendet werden:

java -jar YourJar.jar foo 

Wenn gut gestaltet, dies kann jedoch machen Sie die main() Methode der anderen Klassen überflüssig. Z.B.

public static void main(String... args) { 
    if ("foo".equals(args[0])) { 
     new Foo().execute(); 
    } else if ("bar".equals(args[0])) { 
     new Bar().execute(); 
    } 
} 

zu abstrahieren diese mehr (um loszuwerden if/else-Blöcke), könnte man erwägen, sie implementieren einige Action Schnittstelle mit einem void execute() und halten sie in einem Map erhalten lassen:

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