Criando um frasco de gordura em Gradle

Criando um frasco de gordura em Gradle

1. Visão geral

Neste artigo rápido, abordaremos a criação de um "jarro de gordura" no Gradle.

Basicamente,a fat jar (also known as uber-jar) is a self-sufficient archive which contains both classes and dependencies needed to run an application.

2. Configuração inicial

Vamos começar com um arquivobuild.gradle simples para um projeto Java com duas dependências:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
    compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
}

3. Usando a Tarefa Jar do Plug-in Java

Vamos começar modificando a tarefajar do plug-in Java Gradle. Por padrão, esta tarefa produz jars sem nenhuma dependência.

Podemos sobrescrever esse comportamento adicionando algumas linhas de código. Precisamos de duas coisas para fazê-lo funcionar:

  • um atributoMain-Class no arquivo de manifesto

  • Incluir jarros de dependências

Vamos adicionar algumas modificações à tarefa do Gradle:

jar {
    manifest {
        attributes "Main-Class": "com.example.fatjar.Application"
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

4. Criação de uma tarefa separada

Se quisermos deixar a tarefa jar original como está, podemos criar uma tarefa separada que fará o mesmo trabalho.

O código a seguir adicionará uma nova tarefa chamadacustomFatJar:

task customFatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.example.fatjar.Application'
    }
    baseName = 'all-in-one-jar'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

5. Usando Plugins Dedicados

Também podemos usar os plugins Gradle existentes para criar um frasco de gordura.

Neste exemplo, usaremos o plug-inShadow:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'
    }
}

apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

Assim que aplicarmos o plugin Shadow, a tarefashadowJar estará pronta para uso.

6. Conclusão

Neste tutorial, apresentamos algumas maneiras diferentes de criar frascos de gordura no Gradle. Substituímos a tarefa jar padrão, criamos uma tarefa separada e usamos o plugin shadow.

Qual abordagem é recomendada? A resposta é - depende.

Em projetos simples, é suficiente substituir a tarefa jar padrão ou criar uma nova. Mas, à medida que o projeto cresce, é altamente recomendável o uso de plug-ins, porque eles já solucionaram problemas mais difíceis, como conflitos com arquivos META-INF externos.

Como sempre, a implementação completa deste tutorial pode ser encontradaover on GitHub.