首页 > 解决方案 > Android Studio:JavaExec:找不到或加载主类

问题描述

作为构建脚本的一部分,我想在打包 APK 之前运行一些 Java 代码。

当我尝试构建我的项目时,出现错误:

Error: Could not find or load main class net.bgreco.myapp.build.BuildScript

BuildScript.java位于app/src/main/java/net/bgreco/myapp/build/

在我收到上面的错误消息之前,BuildScript.class确实已成功编译,我可以从命令行运行它而没有错误。

app/build.gradle

task runBuildScript(type: JavaExec) {
    main = 'net.bgreco.myapp.build.BuildScript'
}

tasks.whenTaskAdded { theTask ->
    if (theTask.name.contains('package')) {
        theTask.dependsOn 'runBuildScript'
    }
}

标签: androidandroid-studiogradle

解决方案


这个答案的一些帮助下,我通过如下修改类路径来让它工作。我还需要引用一些 Android 库,所以我包含了android.jar.

app/build.gradle

task runBuildScript(type: JavaExec) {
    String flavor, buildType
    (flavor, buildType) = getCurrentFlavorAndBuildType()
    classpath files("build/intermediates/classes/" + flavor + "/" + buildType, "${android.getSdkDirectory().getAbsolutePath()}\\platforms\\${android.compileSdkVersion}\\android.jar")
    main = 'net.bgreco.myapp.build.BuildScript'
    args = [flavor] // Not needed unless you want to know the current flavor from within the BuildScript
}

tasks.whenTaskAdded { theTask ->
    if (theTask.name.contains('package')) {
        theTask.dependsOn 'runBuildScript'
    }
}

def getCurrentFlavorAndBuildType() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find())
        return [matcher.group(1).toLowerCase(), matcher.group(2).toLowerCase()]
    else {
        println "NO MATCH FOUND"
        return ["", ""];
    }
}

推荐阅读