Как ускорить медленную задачу fatJAR?

Следующая часть является частью моего build.gradle файл:

project(":App") {
    dependencies {
        compile(project(':Shared'))
        compile(project(':Subproject1'))
        compile(project(':Subproject2'))
        compile(project(':Subproject3'))
        compile(project(':Subproject4'))
        compile(project(':Subproject5'))
    }

    jar {
        manifest {
            attributes(
                    'Main-Class': 'com.my.App.Main',
            )
        }
    }

    // To run, use: $ gradle :App:fatJar
    task fatJar(type: Jar) {
        println "fatJarBuild(): 1"
        manifest.from jar.manifest
        println "fatJarBuild(): 2"
        classifier = 'all'
        println "fatJarBuild(): 3"
        from {
            configurations.runtime.collect {
                println "fatJarBuild(): collect" + it.absolutePath
                it.isDirectory() ? it : zipTree(it)
            }
        } {
            exclude "META-INF/*.SF"
            exclude "META-INF/*.DSA"
            exclude "META-INF/*.RSA"
        }

        duplicatesStrategy = DuplicatesStrategy.EXCLUDE

        println "fatJarBuild(): 4"
        with jar
    }       
}

Теперь, когда я немного изменяю файл в моей кодовой базе, требуется значительное время, чтобы закончить fatJar задача:

[... End of "./gradlew :App:fatJar --info" follows ... ] 

:App:compileJava (Thread[Daemon worker Thread 13,5,main]) completed. Took 0.164 secs.
:App:processResources (Thread[Daemon worker Thread 13,5,main]) started.
:App:processResources
Skipping task ':App:processResources' as it is up-to-date (took 0.002 secs).
:App:processResources UP-TO-DATE
:App:processResources (Thread[Daemon worker Thread 13,5,main]) completed. Took 0.002 secs.
:App:classes (Thread[Daemon worker Thread 13,5,main]) started.
:App:classes
Skipping task ':App:classes' as it has no actions.
:App:classes (Thread[Daemon worker Thread 13,5,main]) completed. Took 0.0 secs.
:App:fatJar (Thread[Daemon worker Thread 13,5,main]) started.
:App:fatJar
Executing task ':App:fatJar' (up-to-date check took 0.003 secs) due to:
  Input file /home/work/App/BrainThread.class has changed.
:App:fatJar (Thread[Daemon worker Thread 13,5,main]) completed. Took 5.993 secs.

BUILD SUCCESSFUL

Total time: 7.051 secs
Stopped 0 compiler daemon(s).
Received result Success[value=null] from daemon DaemonInfo{pid=30179, address=[c5e7f6f0-985b-48cc-88b0-ebc8aed7e75b port:33465, addresses:[/0:0:0:0:0:0:0:1%lo, /127.0.0.1]], idle=true, context=DefaultDaemonContext[uid=cc8b9da5-88b5-476a-9cf5-430af98f7f5a,javaHome=/usr/lib/jvm/java-8-openjdk-amd64,daemonRegistryDir=/home/user/.gradle/daemon,pid=30179,idleTimeout=10800000,daemonOpts=-XX:MaxPermSize=256m,-XX:+HeapDumpOnOutOfMemoryError,-Xmx1024m,-Dfile.encoding=UTF-8,-Duser.country=US,-Duser.language=en,-Duser.variant]} (build should be done).

Ты это видишь BrainThread.class был изменен, и в результате началась тяжелая техника.

Могу ли я сделать мой build.gradle больше времени эффективно?

1 ответ

Может быть, кто-то еще придет и скажет мне, что я не прав, но IMO 5 секунд - это не слишком разумное время для создания толстяка. Задача как определено

  • Распаковывает файл jar каждой зависимости,
  • Объединяет распакованные файлы вместе с файлами вашего проекта, а затем
  • Переупаковывает все в новую банку.

В зависимости от того, сколько у вас зависимостей, 5 секунд мне кажутся вполне приемлемыми. Если базовая задача Zip не будет как-то оптимизирована, я не вижу такого изменения времени.

Пара вещей, о которых вы можете подумать:

  1. Вы можете убрать задание fatjar из стандартного цикла сборки, который выполняется для каждого изменения. Вы можете запускать задание fatjar только тогда, когда вы делаете релиз. В большинстве случаев вы должны иметь возможность тестировать изменения локально, не создавая фатжар, поскольку у вас все равно есть все зависимости.

  2. Для одного изменения файла вы выполняете танец распаковки-перепаковки с большим количеством jar зависимостей. Возможно, вы можете написать оптимизированную задачу FATJAR, которая распаковывает старый FATJAR, заменяет измененный файл и перепаковывает его, сокращая количество требуемых операций с файлами.

РЕДАКТИРОВАТЬ: Я только что посмотрел на плагин gradle shadow jar и понял, что он делает именно то, что я описал #2 выше, вносит постепенные изменения в fatjar, что должно дать вам ощутимые улучшения производительности.

Другие вопросы по тегам