2011-11-28 12 views
5

Si tengo un proyecto Java que consta de varios tipos diferentes de archivos (imágenes, sonido, etc.) y múltiples dependencias jar, ¿cuál es una buena manera de empaquetarlo todo en un único contenedor que solo se puede hacer doble clic?haciendo una aplicación Java de un solo contenedor

Sé que las jarras por sí solas son bastante tontas, ya que no miran dentro de sí mismos los archivos de los que dependen (algo que solo realicé después de la mínima frustración (eufemismo)). - Si el jarro A depende de las clases contenidas dentro del vaso B, poner el vaso B dentro del vaso A no funcionará. Jar A debe estar en el mismo directorio que jar B.

... Ahora, sé que podría extraer todos los archivos de todos los otros jar y poner todo en el mismo directorio. Eso sería tipo de trabajo, pero no quiero hacerlo porque: 1. Sería desordenado y 2. aún así no resolvería el problema de tener que tener los archivos de sonido en el mismo directorio que el final tarro. (Por alguna razón, los archivos de sonido actúan de la misma manera que los archivos internos)

Básicamente, solo quiero que los archivos de los que depende mi aplicación no sean detestables y ostentosos. Entonces, si hubiera alguna solución en la que pudiera poner todo dentro de un contenedor y hacer que fuera el único archivo necesario para ejecutar todo el programa, sería óptimo. Sin embargo, estoy dispuesto a aceptar formas creativas/inventivas para eludir el problema, como tener un script por lotes en un directorio principal para ejecutar el archivo jar o algo así. (Digo "o algo así" porque ese escenario exacto solo funcionaría en los sistemas operativos de Windows ... ya sabes a qué me refiero!)

+0

¿cómo está accediendo a sus recursos (archivos de sonido, etc.)? como archivos o como getResource()? –

+0

Estoy pasando su nombre de archivo a un objeto de archivo – Pojo

Respuesta

2

Puede extraer todos los JAR y fusionarlos en un JAR común. Hay tareas ANT y plugins Maven disponibles para hacer esto. Además, si su aplicación está escrita correctamente, no hay nada que le impida incluir también archivos multimedia y otros recursos en el JAR. Solo necesita asegurarse de que estos recursos sean "loaded from the classpath", en lugar de estar cargados desde el directorio de trabajo actual.

+0

¿Cómo podría ... "cargar desde el classpath", exactamente? Estoy usando 2 métodos de reproducción de sonido; uno es jmf, que acepta archivos de sonido como un objeto de URL, y uno es Clip, que acepta los archivos de sonido como objetos de archivo – Pojo

+0

¿Puede incluir algunos nombres de paquete/clase absolutos? javax.sound.sampled.Clip proporciona un método abierto (AudioInputStream stream), que se puede instanciar utilizando un InputStream regular, como el proporcionado por getResourceAsStream(). – ziesemer

+0

Bueno, ¿no sería muy malo usar un nombre de ruta absoluto ..? Porque entonces todo lo que tendrías que hacer es mover el tarro a otro lugar, y de repente ya no funciona. ... Y claro, Clip puede hacer eso, así que supongo que voy a intentarlo ahora, pero con jmf, javax.media.Manager solo puede crear Jugadores de DataSources, MediaLocators y URLs. ¿Qué hay de eso? – Pojo

1

Si usa el complemento de ensamblaje para maven, puede hacer que descargue dependencias, compilar módulos y producir un archivo ejecutable.

1

Si usted está construyendo un jar ejecutable y tienen otros frascos que debe estar disponible en la ruta de clase, hay un Class-Path: la línea en el archivo MANIFEST.MF del frasco que enumera las entradas (incluidos jarras y directorios) para incluir en el classpath cuando se ejecuta la clase principal.

Normalmente uso mi IDE o ant para construir dichos archivos ejecutables y establecer el encabezado Class-Path:.

Por cierto, para hacer que su jar sea ejecutable, configure la clase principal: línea en su archivo MANIFEST.MF.

Aquí se muestra un ejemplo de un jar ejecutable construyo:

Main-Class: com.example.app.MyAppCLI 
Class-Path: log4j.jar driver.jar libraries.jar 

Y aquí es una tarea ant correspondiente a construir este:

<target name="exejar"> 
    <jar destfile="myapp.jar" 
     basedir="bin" 
     include="**/app/*.class"> 
    <manifest> 
     <attribute name="Main-Class" value="com.example.app.MyAppCLI"/> 
     <attribute name="Class-Path" value="log4j.jar driver.jar libraries.jar"/> 
    </manifest> 
    </jar> 
</target> 

Si va a utilizar una herramienta como hormigas a construir sus archivos ejecutables, hará que el proceso sea más fácil de repetir y también manejará casos extremos extraños para usted, como lo que sucede cuando una línea de encabezado en MANIFEST.MF es demasiado larga.

0

Si usa Maven, puede apreciar el onejar-maven-plugin. Un beneficio importante es que todos los archivos jar de la dependencia permanecen en frascos y el código está en su propio contenedor. Todos esos frascos se colocan en un frasco más grande, que se hace ejecutable, evitando así algunos problemas potenciales de classpath. Lea el usage guide y este blog post para obtener más información.

0

tienen un proyecto Java que consta de varios tipos diferentes de archivos (imágenes, sonido, etc.) y múltiples dependencias jar, ¿cuál es una buena manera de empaquetar todo en un solo recipiente que puede hacer doble clic

Una mejor forma de implementar una aplicación de cliente enriquecido. está usando Java Web Start. El usuario final nunca vería un tarro, y se le podría proporcionar un atajo de escritorio o elemento de menú para iniciar la aplicación.

Cuestiones relacionadas