es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando un archivo uber desde Java (NO utilizando Maven o Gradle)

Me gustaría combinar varios JAR en un Uberjar.

En Java, sé cómo sombrear dependencias usando estas dos herramientas:

Pero tengo un servicio web que necesita tomar un classpath dinámico y crear un uberjar a partir de él. Sin embargo, siendo literalmente un servidor backend, Maven y Gradle no están disponibles como herramientas para su uso.

Como puedes ver en el código fuente de estos complementos, no es tan fácil como construir un archivo ZIP combinado con todo su contenido. Debes realizar alguna resolución de recursos duplicados y alguna configuración especial de la caché de log4j también.

¿Existe alguna biblioteca de Java que sea capaz de crear lo mismo que hace la herramienta shadow de John Rengelman, pero sin ejecutarse realmente desde Maven/Gradle?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una biblioteca de Java llamada “One-JAR” que puede crear un Uberjar. One-JAR funciona mediante la fusión de todas las clases y recursos de cada archivo jar en un único archivo JAR. Este archivo JAR único se puede utilizar como un “uberjar” ejecutable que puede ejecutar todo el código fusionado. One-JAR también proporciona un cargador de clases que puede cargar clases tanto desde el archivo jar principal como desde las dependencias incluidas, lo que puede evitar problemas de la ruta de clases.

    Para usar One-JAR, es necesario descargar la biblioteca e incluirla en su proyecto. One-JAR se puede utilizar con las herramientas de compilación Ant, Maven y Gradle, así como de forma independiente. Una vez que haya incluido One-JAR en su proyecto, solo necesita configurar el archivo de compilación para indicarle a One-JAR qué archivos JAR incluir en el uberjar final.

    Uso de ejemplo con Ant:

    <taskdef name="one-jar" classname="com.simontuffs.onejar.Boot"></taskdef>
    <one-jar>
    
    <classpath>
      <zipfileset src="myproject.jar"></zipfileset>
      <zipfileset src="lib/dependency1.jar"></zipfileset>
      <zipfileset src="lib/dependency2.jar"></zipfileset>
    </classpath>
    
    <mainclass>org.example.MainClass</mainclass>
    
    </one-jar>
    

    Esto creará un uberjar con todos los archivos especificados fusionados juntos.

    Otra alternativa es utilizar la biblioteca Java Archive Grinder (JAR Grinder), que también puede crear un Uberjar. JAR Grinder es un proyecto de código abierto que puede fusionar varios archivos jar en uno solo. Proporciona una API sencilla para construir aplicaciones con conocimiento de la ruta de clases que se pueden utilizar para construir Uberjars.

Comments are closed.