2010-02-06 13 views

Respuesta

3

Creo que el propósito de una 'clase principal' significa que el eventual archivo de manifiesto JAR 'etiquetará una clase como' la clase a ejecutar ': para que el usuario final simplemente haga doble clic * o ejecutar una línea de comandos simplificada como:

java -jar <jar>

en lugar de tener que especificar el paquete completo nombre/clase como:

java -cp <jar> com.yourcom.package.classname 

Si estoy en lo cierto, entonces yo no veo cómo lo haría ¿Tiene sentido tener más de una clase principal? Tal vez malinterpreté su pregunta, ¿o hay otro propósito para la clase 'principal'?

Si quiere decir tener dos clases que tienen un método 'principal' - entonces está bien - el usuario final puede iniciar cualquiera de las clases por nombre - y siempre que tengan el método principal estándar sig, por ejemplo:

debería funcionar.

* (en Windows, al menos, y si eso funciona también depende de qué JRE que tienen y probablemente otras cosas)

+0

El motivo de 2 clases principales se debe al servidor y al cliente.Me gustaría tener un archivo jar creado para cada clase principal mientras esté contenido en un proyecto. Tal vez esto aclaró mi pregunta. – Zach

+0

Así que quieres un proyecto y dos jarras, creo: entonces creo que en ese caso probablemente necesites un 'proyecto de forma libre': para que puedas personalizar los guiones de compilación (ant) para hacerlo. Normalmente solo trabajo en dos proyectos en ese escenario: a menos que realmente necesite compartir mucho código entre los dos proyectos: entonces considere crear un tercer proyecto de 'biblioteca'; luego puede agregar eso como una biblioteca dependiente a la otra dos. [Espero que tenga sentido!] – monojohnny

+0

Ok, creo que entiendo en este momento. – Zach

4

No sé cómo el trabajo Netbeans, pero debería haber ningún problema poniendo más de una clase principal en un JAR. En realidad, una clase principal es solo una clase que tiene un método principal y una JAR es una colección de archivos de clase.
La única restricción es que solo puede haber una clase que se iniciará haciendo doble clic en el JAR.

Para iniciar cada clase, no debe usar la opción -jar, pero proporcione el nombre de clase completo.
Por ejemplo, si usted tiene un cliente y un servidor en su clase JAR, el cliente es iniciado por
java -cp file.jar Client
y el servidor de
java -cp file.jar Server.

Una opción es crear un tercer starter clase utilizada para iniciar el servidor o el cliente en función de un argumento de línea de comando (o una ventana de GUI).

8

El JAR File Specification permite solo un atributo Main-Class por JAR, pero el JAR puede tener un número arbitrario de clases que declaran un método main(). Dicha clase se incluirá en la propiedad BuildPackaging del proyecto, a menos que se excluya específicamente.

Como ejemplo concreto, H2 Database incluye estas clases con main():

 
org.h2.jdbcx.JdbcConnectionPool 
org.h2.tools.Backup 
org.h2.tools.ChangeFileEncryption 
org.h2.tools.Console 
org.h2.tools.ConvertTraceFile 
org.h2.tools.ConvertTraceFile 
org.h2.tools.CreateCluster 
org.h2.tools.DeleteDbFiles 
org.h2.tools.Recover 
org.h2.tools.Restore 
org.h2.tools.RunScript 
org.h2.tools.Script 
org.h2.tools.Server 
org.h2.tools.Shell 

Adición: Al parecer, mi proyecto de basura cajón necesita mantenimiento.

 
$ find scratch/src -name \*java | xargs -J % egrep 'main[ \t]*\(Str' % | wc -l 
    109 
+0

+1 respuesta más precisa – stacker

Cuestiones relacionadas