2010-01-07 9 views

Respuesta

43

Puede acceder a ambos a través de java -cp myapp.jar com.example.Main1 y java -cp myapp.jar com.example.Main2. La clase principal predeterminada en el jar es para cuando invocas tu aplicación a través del java -jar myapp.jar.

Ver JAR_(file_format) para más detalles. Cuando selecciona la clase principal en Eclipse, esto es lo que se configura en: Main-Class: myPrograms.MyClass dentro del manifiesto de jar META-INF/MANIFEST.MF en el lado del archivo jar.

+0

Esto no funcionará con la exportación de Eclipse Runnable ya que delegan la carga en un cargador de clases personalizado. –

+4

Esto no funciona si tiene el atributo de ruta de clase –

8

Sí, es posible. Bajo cada una puede agregar otra clase con un método principal para el que ejecuta la clase/método deseado en función del argumento.

E.g.

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

(no se olvide de añadir los controles obvios a sí mismo como args.length y así sucesivamente)

que se puede utilizar de la siguiente manera:

java -jar YourJar.jar foo 

Si bien diseñado, sin embargo, esto puede hacer que el método main() de las otras clases sea superfluo. P.ej.

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

Para abstracto esto más (para deshacerse de if/else bloques), que podrían considerar la posibilidad de dejar a poner en práctica alguna de las interfaces Action con un void execute() y conseguir de ellos en 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(); 
} 
Cuestiones relacionadas