Gradle:分发可执行的混淆 Jar 文件

Posted

技术标签:

【中文标题】Gradle:分发可执行的混淆 Jar 文件【英文标题】:Gradle: Distributing Executable, Obfuscated Jar File 【发布时间】:2018-07-13 12:59:20 【问题描述】:

我正在尝试使用带有 proguard 的 gradle 来混淆代码,然后生成一个 zip 文件进行分发。我想使用distribution plugin,但它总是包含由 jar 任务生成的 jar。有没有办法强制分发插件省略原始(非混淆)jar,只包含混淆jar?除了原始 jar 之外,我可以轻松添加混淆 jar,但我想分发混淆 jar 而不是原始 jar,以便生成的执行脚本针对混淆版本运行。

这是我删减的 build.gradle 文件:

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'net.sf.proguard:proguard-gradle:5.3.3'
    


apply plugin: 'java'
apply plugin: 'application'

task obfuscate(type: proguard.gradle.ProGuardTask) 
    configuration 'proguard.txt'

    injars "build/libs/$rootProject.name.jar"
    outjars "build/libs/$rootProject.name-release.jar"


jar.finalizedBy(project.tasks.obfuscate)

distributions 
    main 
        contents 
            from(obfuscate) 
                into "lib"
            
            from(jar) 
                exclude "*.jar"
            
        
    

我在分发块中尝试了很多方法来尝试排除原始 jar,但似乎没有任何效果。

任何想法将不胜感激。

【问题讨论】:

【参考方案1】:

这不是最佳解决方案,但我能够通过在混淆步骤结束时重命名 jar 来解决此问题。现在,我将原始 jar 命名为 <JAR_NAME>-original.jar,并将混淆后的 jar 命名为原始 jar 的名称。我仍然希望有更好的方法来做到这一点,但这似乎有效。

这是更新的、删减的build.gradle 文件:

import java.nio.file.Paths

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath 'net.sf.proguard:proguard-gradle:5.3.3'
    


apply plugin: 'java'
apply plugin: 'application'

def jarNameWithoutExtension = jar.archiveName.with  it.take(it.lastIndexOf(".")) 
def obfuscatedJarName = "$jarNameWithoutExtension-release.jar"
def jarFileLocation = jar.archivePath.parent
def obfuscatedFilePath = Paths.get(jarFileLocation, obfuscatedJarName)

task obfuscate(type: proguard.gradle.ProGuardTask) 
    configuration 'proguard.txt'

    injars jar.archivePath
    outjars obfuscatedFilePath.toString()

    // Rename the original and obfuscated jars.  We want the obfuscated jar to
    // have the original jar's name so it will get included in the distributable
    // package (generated by installDist / distZip / distTar / assembleDist).
    doLast 
        jar.archivePath.renameTo(Paths.get(jarFileLocation, "$jarNameWithoutExtension-original.jar").toFile())

        obfuscatedFilePath.toFile().renameTo(jar.archivePath)
    


jar.finalizedBy(project.tasks.obfuscate)

【讨论】:

以上是关于Gradle:分发可执行的混淆 Jar 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 Gradle 创建可执行 jar 文件并在 maven 中导入 jar

运行从基于 gradle 的项目构建的可执行 jar 文件

如何在 Gradle 中使用带有混淆 jar 的 Launch4J

Gradle 打可执行jar包

Spring Boot Gradle 打包可执行Jar文件!

如何在我的gradle项目中创建单个可执行的jar?