Ejecutar un método principal de Java con Gradle

1. Introducción

En este tutorial, exploraremos los diferentes métodos para ejecutar un método principal de Java usando Gradle.

2. Método principal de Java

Hay varias formas en las que podemos ejecutar un método principal de Java con Gradle. Veámoslos de cerca usando un programa simple que imprime un mensaje en la salida estándar:

public class MainClass { public static void main(String[] args) { System.out.println("Goodbye cruel world ..."); } }

3. Ejecución con el complemento de la aplicación

El complemento de la aplicación es un complemento básico de Gradle que define una colección de tareas listas para usar que nos ayudan a empaquetar y distribuir nuestra aplicación.

Comencemos insertando lo siguiente en nuestro archivo build.gradle :

plugins { id "application" } apply plugin : "java" ext { javaMain } application { mainClassName = javaMainClass }

El complemento genera automáticamente una tarea llamada ejecutar que solo requiere que apuntemos a la clase principal . El cierre en la línea 9 hace exactamente eso, lo que nos permite activar la tarea:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew run > Task :run Goodbye cruel world ... BUILD SUCCESSFUL in 531ms 2 actionable tasks: 1 executed, 1 up-to-date

4. Ejecución de la tarea JavaExec

A continuación, implementemos una tarea personalizada para ejecutar el método principal con la ayuda del tipo de tarea JavaExec :

task runWithJavaExec(type: JavaExec) { group = "Execution" description = "Run the main class with JavaExecTask" classpath = sourceSets.main.runtimeClasspath main = javaMainClass }

Necesitamos definir la clase principal en la línea 5 y, además, especificar la ruta de clases. La ruta de clase se calcula a partir de las propiedades predeterminadas de la salida de la compilación y contiene la ruta correcta donde se coloca realmente la clase compilada.

Observe que en cada escenario, usamos el nombre completo, incluido el paquete, de la clase principal .

Ejecutemos nuestro ejemplo usando JavaExec :

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithJavaExec > Task :runWithJavaExec Goodbye cruel world ... BUILD SUCCESSFUL in 526ms 2 actionable tasks: 1 executed, 1 up-to-date

5. Ejecución de la tarea Exec

Finalmente, podemos ejecutar nuestra clase principal usando el tipo de tarea Exec base . Dado que esta opción nos ofrece la posibilidad de configurar la ejecución de múltiples formas, implementemos tres tareas personalizadas y las discutiremos individualmente.

5.1. Ejecución de la salida de compilación compilada

Primero, creamos una tarea Exec personalizada que se comporta de manera similar a JavaExec :

task runWithExec(type: Exec) { dependsOn build group = "Execution" description = "Run the main class with ExecTask" commandLine "java", "-classpath", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass }

Podemos ejecutar cualquier ejecutable (en este caso java) y pasar los argumentos necesarios para que se ejecute.

Configuramos la ruta de clases y apuntamos a nuestra clase principal en la línea 5, y también agregamos una dependencia a la tarea de compilación en la línea 2. Esto es necesario, ya que solo podemos ejecutar nuestra clase principal después de compilarla:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExec > Task :runWithExec Goodbye cruel world ... BUILD SUCCESSFUL in 666ms 6 actionable tasks: 6 executed 

5.2. Ejecutando desde un tarro de salida

El segundo enfoque se basa en el envase de tarro de nuestra pequeña aplicación:

task runWithExecJarOnClassPath(type: Exec) { dependsOn jar group = "Execution" description = "Run the mainClass from the output jar in classpath with ExecTask" commandLine "java", "-classpath", jar.archiveFile.get(), javaMainClass } 

Observe la dependencia de la tarea jar en la línea 2 y el segundo argumento del ejecutable java en la línea 5. Usamos un jar normal, por lo que necesitamos especificar el punto de entrada con el cuarto parámetro:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExecJarOnClassPath > Task :runWithExecJarOnClassPath Goodbye cruel world ... BUILD SUCCESSFUL in 555ms 3 actionable tasks: 3 executed

5.3. Ejecutando desde un jar de salida ejecutable

La tercera forma también se basa en el empaquetado del jar, pero definimos el punto de entrada con la ayuda de una propiedad de manifiesto :

jar { manifest { attributes( "Main-Class": javaMainClass ) } } task runWithExecJarExecutable(type: Exec) { dependsOn jar group = "Execution" description = "Run the output executable jar with ExecTask" commandLine "java", "-jar", jar.archiveFile.get() } 

Aquí, ya no necesitamos especificar la ruta de clases , y simplemente podemos ejecutar el jar:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExecJarExecutable > Task :runWithExecJarExecutable Goodbye cruel world ... BUILD SUCCESSFUL in 572ms 3 actionable tasks: 3 executed

6. Conclusión

En este artículo, exploramos las diversas formas de ejecutar un método principal de Java utilizando Gradle.

Fuera de la caja, el complemento de la aplicación proporciona una tarea mínimamente configurable para ejecutar nuestro método. El tipo de tarea JavaExec nos permite ejecutar el método principal sin especificar ningún complemento.

Por último, el tipo de tarea Exec genérico se puede utilizar en varias combinaciones con el ejecutable java para lograr los mismos resultados, pero requiere una dependencia de otras tareas.

Como de costumbre, el código fuente de este tutorial está disponible en GitHub.