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

4
我正在尝试使用gradle和proguard混淆代码,然后生成zip文件进行分发。我想使用distribution plugin,但它总是包括由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个回答

5

这不是最好的解决方案,但我通过在混淆步骤结束时重命名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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接