2012-04-02 20 views
5

Esta es una pregunta muy tonta a la que no puedo responder de manera precisa.cuál es la estructura interna correcta del archivo JAR

Fondo.

Estoy usando Eclipse (con uno de los plugins ANT, en un terminal XP).

Me acaban de comenzar a jugar con ANT, en la Directiva [jarra] Estoy fijando la ubicación de mi archivo JAR terminado y me sale el siguiente cuando estoy descomprimir "el archivo

META-INF/MANIFIESTO. MF MyMainFile.class

que es consistente con la que se encuentra en el sitio web de Oracle para la estructura interna. (aquí http://docs.oracle.com/javase/tutorial/deployment/jar/view.html)

¿Pero cuando intento ejecutar mi archivo aparece un error de "clase principal no encontrada"?

he visto algunos otros puestos donde la gente ha 'desabrochado' el archivo JAR y terminó con una estructura de la siguiente ...

META-INF/MANIFEST.MF dtvcontrol/DTVControlApp.class

(de aquí http://www.coderanch.com/t/528312/java/java/standalone-application)

Así que debo obtener una estructura en la que mis archivos de clase están en un directorio que refleja el nombre del paquete de ... por ejemplo

META-INF/MANIFEST.MF MyPackage/MyMainFile.class

y, si es así, ¿por qué obtengo la estructura incorrecta usando ANT o por qué hay 2 estructuras internas "correctas" diferentes? (cómo especificar main-class y classpath para cada/control lo que obtengo)

También en caso de que esté interesado, en los estados del archivo MANIFEST (compilación usando ANT) [attribute name = "Main-Class" value = "MyPackage.MyMainFile" /]

también la estructura de directorios del paquete en fase de desarrollo es el siguiente ...

/JavaDev/MyTestPackage/src (contiene los archivos de origen) // JavaDev/MyTestPackage/bin (contiene los archivos de clase de eclipse, o de la tarea ANT JAVAC, ¿lo he nombrado incorrectamente? ¿Debería haberlo llamado build?)

Además de esto, cuando creo el contenedor no lo denomino 'MyTestPackage.jar' sino simplemente 'test.jar' ¿podría ser esto un problema? Supongo que no es como si hubiera entendido que de eso se trata la definición de la [clase principal].

Además de todo esto ...

'MyTestPackage' Es en realidad una pequeña biblioteca de mensajes de error visual que yo uso en otros lugares, y no tengo un segundo archivo que tiene una clase principal a utilizar para la prueba. Como tal, apunta a varias bibliotecas (¿necesito copiar todas las bibliotecas SWT a un directorio específico?)

He leído en alguna parte que si cargo bibliotecas en mi clase principal (lo cual obviamente hago para abrir la ventana) entonces intentar ejecutar el programa fallará en una 'clase principal no encontrada' si las uso, mismas también es cierto para agregar cualquier miembro "estático final" (que utilizo para el inicio de sesión de errores).

Problema 'Final estático' ... Traté de ajustar la ruta de clase en ANT, y recibí una carga de otros errores para la conexión a Log4J y mi 'envoltorio' que uso (para hacer que sea un mala importación), pero las bibliotecas existen donde deberían establecerse en el classpath.

Siento que estoy casi ahí .... pero no del todo ...

que estoy haciendo esto para los pequeños proyectos de biblioteca 'que estoy creando con la intención de utilizar MAVAN para los principales paquete externo que los conectará todos juntos ... por ahora, sin embargo, solo quiero poner esto en marcha para que funcione.

Puedo suministrar la fuente completa o cualquier otra información según sea necesario.

Gracias de antemano ...

David

+0

vikiiii Iba a hacer un comentario astuto preguntándome cuántos "ojos" tienes ... pero decidiste no hacerlo (fíjate 3 "." No uno, no dos). ;) – DaveM

Respuesta

8

Es muy sencillo cuando se sabe dónde buscar. Digamos que su META-INF/MANIFEST.MF contiene la línea:

Main-Class: mypackage.MyMainFile 

entonces la estructura de la jarra necesita ser

META-INF/MANIFEST.MF 
mypackage/MyMainFile.class 

donde MyMainFile tiene que estar en el paquete adecuado:

package mypackage; 
public class MyMainFile { 
    public static void main(String[] args) { 
... 

Su mensaje de error es causado por MyMainFile que está en el lugar incorrecto.

Editar: que ha pasado un tiempo desde la última vez que lo hice con la hormiga, pero creo que necesita algo como esto: una estructura de archivos fuente que refleja la estrutura paquete, dicen

src/main/java/mypackage/MyMainFile.java 

y un directorio para poner el archivo de clase compilado en, digamos

target 

(estoy usando convenciones de maven aquí, hormiga no le importa y se puede utilizar el (botón derecho del ratón) -> propiedades-> Java Build camino-> Pestaña Fuentes en eclipse para establecer los di fuente r a src/main/java y el objetivo a target/classes). Luego, en la hormiga, tienen un objetivo de compilación que recoge del origen al destino:

<target name="compile"> 
    <mkdir dir="target/classes"/> 
    <javac srcdir="src/main/java" destdir="target/classes"/> 
</target> 

de modo que después ant compile debería ver el archivo de clase en el objetivo

target/classes/mypackage/MyMainFile.class 

a continuación tienen una tarea tarro de hormiga que los paquetes esto:

<target name="jar" depends="compile"> 
    <jar destfile="target/MyJarFile.jar" basedir="target/classes"> 
     <manifest> 
      <attribute name="Main-Class" value="mypackage.MyMainFile"/> 
     </manifest> 
    </jar> 
</target> 

Después de decir ant compile jar que debe tener un MyJarFile archivo.jar dentro del objetivo y

java -jar MyJarFile.jar 

debe ejecutar el método principal.

+0

OK, entonces, ¿cómo consigo que ANT proporcione ese tipo de estructura en el archivo JAR? ¿O estoy ejecutando ANt desde la ubicación incorrecta? (Tenga en cuenta que estoy ejecutando la tarea ANT desde dentro de eclipse, no desde la CLI). ¿Y por qué ANT está creando el otro tipo de estructura de directorios (que es correcto y cómo especificar uno u otro, que no he encontrado en los documentos de ANT ... todavía! – DaveM

+0

wallenborn actualmente en mi "compilación" Estoy señalando a aa destfile = "$ {clase}" y clase = "compilación", así que es aquí donde mi problema es ?? Voy a cambiarlo y ver qué pasa ... – DaveM

+0

En la tarea de compilación, es probable que también sea probable que destfile específico de todos modos. Básicamente, solo quiere contar la tarea de compilación: tomar todo en este directorio src, recursivamente, compilarlo y escribir las clases resultantes en ese directorio dest, preservando los subdirectorios. – wallenborn

Cuestiones relacionadas