performance - 如何加快慢速fatJAR任务?

标签 performance gradle gradle-2

以下部分是我的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更加省时吗?

最佳答案

也许会有其他人来告诉我我错了,但是IMO 5秒并不是制造胖子的合理时间。定义的任务

  • 解压缩每个依赖项jar文件
  • 合并解压缩的文件,项目类文件以及
  • 将所有内容重新打包到一个新的jar中。

  • 根据您有多少依赖项,5秒钟对我来说似乎还可以。除非底层的Zip任务经过某种方式的优化,否则我看不到这种时序变化。

    您可以做的几件事:
  • 您可以将fatjar任务移出标准构建周期,该周期会在每次更改时运行。您只能在执行发行版时运行fatjar任务。在大多数情况下,您应该能够在本地测试更改,而无需构建胖子,因为无论如何您都可以使用所有依赖项。
  • 对于单个文件更改,您将使用大量依赖项jar进行unpack-repack舞蹈。也许您可以编写一个优化的fatjar任务,该任务解压缩旧的fatjar ,替换更改的文件并重新打包,从而减少了所需的文件操作次数。

  • 编辑:我只是看了一下gradle shadow jar plugin,意识到它完全按照我在上面的#2所述,对胖子进行了增量更改,这应该为您带来明显的性能改进。

    关于performance - 如何加快慢速fatJAR任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36644500/

    相关文章:

    sql-server - 测试自定义 ORM 解决方案性能开销 - 如何?

    java - Android海量数据库创建

    java - Gradle:MessageIOException:无法将消息 [EndOfStream] 写入 127.0.0.1(防火墙)?

    java - 如果在 gradle 插件任务中使用,getResourceAsStream 在 win10 上返回 null

    Android Studio 在 gradle 同步期间无限期地卡住,但同一个项目在 Intellij Idea 中运行良好

    Gradle - 下载单个 groupID :artifactID from Artifactory 的所有版本 jar

    gradle - 将命令行参数传递给Gradle

    Angular: [disabled] ="isDisabled()"是正确的方法吗?

    php - 在 PHP 中使用正则表达式作为请求处理程序是否不好?