Empaquetar y ejecutar una aplicación Java con dependencias de primavera

votos
5

Creé una aplicación Java autónoma que tiene un conjunto de dependencias (Apache Commons libs, etc.) y una dependencia del framework Spring, que a su vez tiene varias dependencias.

Lo construí en Eclipse, donde funciona bien. Ahora necesito implementarlo en producción, así que estoy tratando de encontrar la mejor manera de empaquetarlo con todas las dependencias y también cómo invocarlo (se invocará desde la línea de comandos).

La forma de fuerza bruta sería exportar mi proyecto como un contenedor, encontrar todos los archivos jar dependientes (y sus dependencias), copiarlos a un directorio común, escribir un script de shell que incluya cada uno en el classpath y ejecutarlo. Obviamente eso parece estúpido y tedioso.

¿Debo usar Ant, Maven? ¿Debo empaquetar todos los frascos de primavera dependientes en un solo archivo grande? Cualquier consejo sobre cómo lidiar con esto sería útil.

Publicado el 19/02/2009 a las 08:26
por usuario
En otros idiomas...                            


10 respuestas

votos
4

El despliegue de Java sigue siendo estúpido y tedioso en 2009. Por lo tanto, la opción habitual es escribir este pequeño script. Si coloca todos sus JAR en un directorio (por ejemplo, lib\), puede usar un script común que construye el classpath automáticamente (vea esta entrada en el blog ). Sugiero agregar cd /d %~dp0al principio un CD en el directorio del script.

Maven 2 tiene un complemento que puede armar su aplicación en un "super JAR" ( ensamblaje mvn: ensamblaje ). Esto funciona a menos que utilice el controlador JCC de DB2 (que contiene paquetes "COM.ibm. " Que se convierten a com.ibm. -> ClassNotFoundException).

La última solución, si ya tiene ANT build.xml que funciona, es desempaquetar todos los JAR dependientes y crear un "super JAR" usted mismo.

Respondida el 19/02/2009 a las 08:43
fuente por usuario

votos
1

Descubrimos que la mejor solución para el manejo y empaquetado de dependencias es usar Maven con el plugin de ensamblaje . Esto proporciona un medio muy elegante para empaquetar sus proyectos, junto con todas las dependencias de tiempo de ejecución y scripts de respaldo en una distribución binaria. Una de las mayores ventajas del uso de ensamblajes es que es posible dividir sus proyectos en componentes distintos según la necesidad. Si está utilizando Spring Integration es bastante común, tendría componentes separados para dividir en varias máquinas. El complemento de ensamblaje le permite configurar esto según sus requisitos.

Respondida el 19/02/2009 a las 08:44
fuente por usuario

votos
0

Puede usar un iniciador que establece la ruta de clase correctamente. Entonces, tendrá mucha más flexibilidad para empaquetar sus JAR. Podrías ponerlos fácilmente en un directorio, que es mucho más limpio que crear un jar "ueber" bastardo ...

Uno de esos lanzadores es commons-launcher .

Respondida el 19/02/2009 a las 08:50
fuente por usuario

votos
2

Con Ant puedes hacer algo a lo largo de lo siguiente:

  1. Agrupe todas las dependencias.
  2. Empaque un archivo JAR con su aplicación e incruste referencias a las dependencias en el archivo MANIFEST.MF con la dirección "Class-Path" dentro del contenedor. Eso debería eliminar la necesidad de construir el classpath en el lanzamiento.
  3. Agrúpelo todo como un archivo y distribúyalo. Debería ser suficiente ejecutar el jar directamente con "java -jar your.jar".

Para administrar sus dependencias, puede ir con Ivy . Al igual que Maven, es capaz de recuperar dependencias en el momento de la compilación desde cualquiera de los repositorios que configure, incluidos los repositorios Maven o su propio repositorio privado.

Respondida el 19/02/2009 a las 09:16
fuente por usuario

votos
0

Estamos utilizando Maven 2 con el plugin m2eclipse ; funciona bastante bien El complemento tiene una vista de gráfico de dependencia, mostrará conflictos, etc.

Ahora, si desea empaquetar todas sus dependencias en el único contenedor, puede consultar Jar Jar Links (¡no es una broma!).

Respondida el 19/02/2009 a las 23:01
fuente por usuario

votos
0

Muchas de tus preocupaciones desaparecen si conviertes tu JAR en ejecutable y agregas un manifiesto que incluya ClassPath. Por desgracia, tiene que ZIP el JAR y sus dependencias, pero se resuelven sus problemas CLASSPATH.

¿Qué tal crear un paquete OSGi? Todavía no lo he investigado, pero se supone que es lo siguiente para empaquetar aplicaciones Java. Se usa en servidores de aplicaciones como Spring's dm Server. Tal vez te pueda ayudar también.

Respondida el 21/02/2009 a las 13:22
fuente por usuario

votos
0

En mi script de compilación ANT, genero las secuencias de comandos de inicio * .bat y * .sh con la lista de JAR construidos dinámicamente en tiempo de compilación en función del contenido del directorio de lib de la compilación.

Por ejemplo, para crear la lista de jarras con separadores apropiados:

<path id="jar-classpath">
    <fileset dir="${build.war.dir}/WEB-INF/lib">
        <include name="**/*.jar" />
    </fileset>
</path>

<pathconvert refid="jar-classpath" targetos="unix" property="exec.classpath.unix">
       <map from="${build.war.dir}\WEB-INF\lib\" to="../lib/"/>
</pathconvert>

<pathconvert refid="jar-classpath" targetos="windows" property="exec.classpath.windows">
        <map from="${build.war.dir}\WEB-INF\lib\" to="../lib/"/>
</pathconvert>

Puede usar los valores ${exec.classpath.unix}y ${exec.classpath.windows}en los scripts de invocación java.

Respondida el 21/02/2009 a las 13:41
fuente por usuario

votos
1

¿Todo este amor de Maven y nadie menciona a Ivy? ¡Oh querido!

Bueno, aquí está Ant Ivy y aquí está la comparación con Maven2 . Por favor, eche un vistazo también antes de ir con casi todo el mundo está sugiriendo.

Respondida el 21/02/2009 a las 14:00
fuente por usuario

votos
0

El complemento maven-assembly-puede no ser la mejor opción. Debería echarle un vistazo al plugin onejar-maven, como se describe aquí:

http://blog.jayway.com/2009/03/22/executable-jar-with-onejar-maven-plugin/

Permite que todos los archivos jar de dependencia permanezcan vacíos, y el código está en su propio contenedor. Todos esos frascos se ponen en un frasco más grande, que se hace ejecutable.

Respondida el 17/04/2009 a las 05:43
fuente por usuario

votos
0

También es posible usar Gradle y aquí es cómo puede hacerlo allí:

mainClassName = "my.App"

task runnableJar(type: Jar, dependsOn: [':assemble']) {
    from files(sourceSets.main.output.classesDir)
    from files(sourceSets.main.output.resourcesDir)
    from configurations.runtime.asFileTree.files.collect { zipTree(it) }

    manifest {
        attributes 'Main-Class': mainClassName
    }
}
Respondida el 24/04/2017 a las 20:17
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more