Seth
Seth

Reputation: 435

Gradle multi project build failing with UnsupportedNotationException

I'm attempting to convert an Eclipse/ANT project to Android Studio & Gradle. I've exported gradle build scripts from Eclipse, translated some third party libs to maven central repo references, and imported the projects to Android Studio.

I'm attempting to setup a multi project build. My current structure is:

Root     
  -- AndroidLibraryProject    
    -- build.gradle
  -- AndroidAppProject
    -- build.gradle
    -- settings.gradle

The content of the relevant build files is as follows:

AndroidLibraryProject/build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'android-library'

repositories {
    mavenCentral()
    maven {
        url "https://github.com/dahlgren/vpi-aar/raw/master"
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:18.0.+'
    compile 'com.viewpagerindicator:library:2.4.2-SNAPSHOT'
    compile files('libs/crashlytics.jar')
    compile files('libs/gson-2.0.jar')
}

android {
    compileSdkVersion "Google Inc.:Google APIs:19"
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 17
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
    }
}

AndroidAppProject/build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

evaluationDependsOn(':AndroidLibraryProject')

apply plugin: 'android'

dependencies {
    compile project()
}

android {
    compileSdkVersion 18
    buildToolsVersion "19"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src2']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}

AndroidAppProject/settings.gradle

include ':AndroidLibraryProject'
project(':AndroidLibraryProject').projectDir = new File(settingsDir, '../AndroidLibraryProject')

The LibraryProject cleans and builds fine on its own.

A problem occurred evaluating root project 'AndroidAppProject'.
> org.gradle.api.internal.notations.api.UnsupportedNotationException (no error message)

and the stack trace is:

* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating root project 'AndroidAppProject'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:54)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:132)
    at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:38)
    at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:25)
    at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:55)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:468)
    at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:76)
    at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:31)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:142)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
    at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:50)
    at org.gradle.api.internal.Actions$RunnableActionAdapter.execute(Actions.java:171)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:201)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:174)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:170)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:139)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:46)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at org.gradle.launcher.Main.main(Main.java:37)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
    at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:30)
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:127)
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:58)
Caused by: org.gradle.api.internal.notations.api.UnsupportedNotationException
    at org.gradle.api.internal.notations.parsers.TypedNotationParser.parseNotation(TypedNotationParser.java:45)
    at org.gradle.api.internal.notations.ProjectDependencyFactory.createFromMap(ProjectDependencyFactory.java:37)
    at org.gradle.api.internal.artifacts.DefaultDependencyFactory.createProjectDependencyFromMap(DefaultDependencyFactory.java:59)
    at org.gradle.api.internal.artifacts.dsl.dependencies.DependencyFactory$createProjectDependencyFromMap.call(Unknown Source)
    at org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.project(DefaultDependencyHandler.groovy:75)
    at build_61tpm2tlp3rmsq0660pqjvv93o$_run_closure1.doCall(/Users/seth/Documents/Development/Android/AndroidAppProject/build.gradle:15)
    at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:58)
    at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:130)
    at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:91)
    at org.gradle.api.internal.project.AbstractProject.dependencies(AbstractProject.java:883)
    at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:246)
    at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:134)
    at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147)
    at org.gradle.groovy.scripts.BasicScript.methodMissing(BasicScript.java:79)
    at build_61tpm2tlp3rmsq0660pqjvv93o.run(/Users/seth/Documents/Development/Android/AndroidAppProject/build.gradle:14)
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:52)
    ... 33 more

Any guidance here would be much appreciated. Am I going about this project configuration all wrong? I'm not even sure it has anything to do with my build configuration at all.

Upvotes: 2

Views: 1393

Answers (2)

Seth
Seth

Reputation: 435

While Scott Barta was right - my settings.gradle file was at the wrong directory level and evaluationDependsOn was unnecessary, it still wasn't the cause of the UnsupportedNotationException. Apparently the call to

AndroidAppProject/build.gradle

dependencies {
    compile project()
}

was completely unnecessary, even though this was a result of the Gradle export from ADT in Eclipse. I created a new project in Android Studio and compared the build file it created to mine and noticed this discrepancy.

After removing that and moving my settings.gradle file up to the root, it was all down hill from there.

Upvotes: 0

Scott Barta
Scott Barta

Reputation: 80010

Move the settings.gradle file one level up to the root directory. You ought to then be able to specify it like this:

include ':AndroidLibraryProject', ':AndroidAppProject'

The bit with evaluationDependsOn in your app's build file may be more complicated than you need. The normal way to have an app depend on a library project is with:

dependencies {
    compile project(':AndroidLibraryProject')
}

At the moment Android Studio doesn't support having libraries or modules outside the project root (https://code.google.com/p/android/issues/detail?id=56367), and I think your original setup might qualify as such, since it could be treating the directory containing settings.gradle as the root. It will be happier with things set up like I've described.

Upvotes: 3

Related Questions