【发布时间】:2017-03-15 02:52:03
【问题描述】:
我尝试在我的 Gradle 脚本中使用 ProGuard 来在每次构建时混淆我的代码,但是我遇到了以下错误:
FAILURE: Build failed with an exception.
* What went wrong:
Neither path nor baseDir may be null or empty string. path='null' basedir='/Users/hassansyyid/Workspace/Random/Launcher/launcher'
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 1.888 secs
这是我的 build.gradle:
import proguard.gradle.ProGuardTask
apply plugin: 'com.github.johnrengelman.shadow'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:5.3.1'
}
}
jar {
manifest {
attributes("Main-Class": "com.skcraft.launcher.Launcher")
}
}
dependencies {
compile 'org.projectlombok:lombok:1.12.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.3.0'
compile 'commons-lang:commons-lang:2.6'
compile 'commons-io:commons-io:1.2'
compile 'com.google.guava:guava:15.0'
compile 'com.beust:jcommander:1.32'
compile 'com.miglayout:miglayout:3.7.4'
compile 'com.google.code.findbugs:jsr305:3.0.0'
}
processResources {
filesMatching('**/*.properties') {
filter {
it.replace('${project.version}', project.version)
}
}
}
task obfuscate(type: proguard.gradle.ProGuardTask) {
configuration 'proguard.txt'
injars "${buildDir}/libs/launcher-${version}.jar"
outjars "${buildDir}/libs/launcher-${version}-obf.jar"
libraryjars configurations.compile.find { it.name.startsWith("lombok") }
libraryjars configurations.compile.find { it.name.startsWith("jackson-databind") }
libraryjars configurations.compile.find { it.name.startsWith("jackson-core") }
libraryjars configurations.compile.find { it.name.startsWith("jackson-annotation") }
libraryjars configurations.compile.find { it.name.startsWith("crypto") }
libraryjars configurations.compile.find { it.name.startsWith("guava") }
libraryjars configurations.compile.find { it.name.startsWith("jcommander") }
libraryjars configurations.compile.find { it.name.startsWith("miglayout") }
libraryjars configurations.compile.find { it.name.startsWith("jsr305") }
libraryjars configurations.compile.find { it.name.startsWith("commons-io") }
libraryjars configurations.compile.find { it.name.startsWith("commons-lang") }
}
shadowJar {
dependencies {
exclude(dependency('org.projectlombok:lombok'))
}
}
build.dependsOn(shadowJar)
build.dependsOn(obfuscate)
我发现的关于这个问题的唯一信息是它与obfuscate 任务有关。我通过注释掉build.dependsOn(obfuscate) 确认了这一点,构建成功。
我查看了错误,但找不到任何有用的信息。另外,我正在运行 Gradle 3.1,这是最新的 Gradle 版本。
我的 proguard.txt:
# Include java runtime classes
-libraryjars <java.home>/lib/rt.jar
# Output a source map file
-printmapping proguard.map
# Keep filenames and line numbers
-keepattributes SourceFile, LineNumberTable
# Disable certain proguard optimizations which remove stackframes (same as Android defaults)
-optimizations !method/inlining/*
-keep public class * {
public protected *;
}
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
提前感谢您的帮助!
【问题讨论】:
-
你能发布你的 proguard.txt 文件吗?我相信错误就在那里。
-
@sub6resources:添加了 proguard.txt
-
嗯,它不存在。你知道它所说的 path 和 baseDir 可能在哪里吗?
-
另外,你用的是什么IDE?
-
@HassanSyyid 请与我们分享您的 gradle.properties 文件
标签: java gradle build.gradle proguard