Gradle: path 和 baseDir 都不能为 null 或空字符串

Gradle: Neither path nor baseDir may be null or empty string

我试图在我的 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) 来确认这一点并且构建成功。

我查找了错误,但找不到任何有用的信息。还有,我是运行Gradle3.1,最新的Gradlebuild.

我的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 任务中声明库 jar 的方式。根据 the ProGuard homepage 的文档,需要为 libraryjars 设置指定一个文件集合。

Class paths are specified as Gradle file collections, which means they can be specified as simple strings, with files(Object), etc.

我更新了您的 gradle 文件并且能够成功 运行 构建:

import proguard.gradle.ProGuardTask

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'java'

buildscript {
  repositories {
    mavenCentral()
    jcenter()
  }

  dependencies {
    classpath group: 'net.sf.proguard', name: 'proguard-gradle', version: '5.3.1'
    classpath group: 'com.github.jengelman.gradle.plugins', name: 'shadow', version: '1.2.4'
  }
}

repositories {
  mavenCentral()
  jcenter()
}

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 jar
  outjars "${buildDir}/libs/launcher-${version}-obf.jar"

  libraryjars files(configurations.compile.collect())
}

shadowJar {
  dependencies {
    exclude(dependency('org.projectlombok:lombok'))
  }
}

build.dependsOn(shadowJar)
build.dependsOn(obfuscate)


task wrapper(type: Wrapper) { gradleVersion = "3.1" }