14

I have a top level Android Gradle project. There are multiple subprojects nested below this projects (sometimes they are 2 level deep) i.e:

top level project | project1 vendor libraries | lib1 lib2 

lint is aborting my build in some of the libraries projects. I can edit each individual library project's build.gradle to fix the problem with

android { lintOptions { abortOnError false } } 

However, I would prefer the following code in the top level build.gradle script:

subprojects { afterEvaluate { if (getPlugins().hasPlugin('android') || getPlugins().hasPlugin('android-library')) { println name // for debugging android { lintOptions { abortOnError false } } } } } 

The conditional statement makes sure to hook only into projects with an android plugin. I could only get this to work using afterEvaluate. However, my build is still failing on lint errors.

Does anyone have have a clean solution to inject these settings from the top level?

UPDATE:

Rearranging the subprojects and afterEvaluate or using allprojects still gives the same following kind of error:

7: Task failed with an exception. ----------- * What went wrong: Execution failed for task ':3rdparty:OrmLiteQueryBuilder:lint'. > [Ljava/util/HashMap$Entry; * 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: 40.528 secs 

Stacktrace:

7: Task failed with an exception. ----------- * What went wrong: Execution failed for task ':3rdparty:OrmLiteQueryBuilder:lint'. > [Ljava/util/HashMap$Entry; * Try: Run with --info or --debug option to get more log output. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':3rdparty:OrmLiteQueryBuilder:lint'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:286) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66) Caused by: java.lang.NoClassDefFoundError: [Ljava/util/HashMap$Entry; at com.android.build.gradle.internal.dsl.LintOptionsImpl$1.$getStaticMetaClass(LintOptionsImpl.groovy) at com.android.build.gradle.internal.dsl.LintOptionsImpl$1.<init>(LintOptionsImpl.groovy) at com.android.build.gradle.internal.dsl.LintOptionsImpl.syncTo(LintOptionsImpl.groovy:450) at com.android.build.gradle.internal.dsl.LintOptionsImpl$syncTo.call(Unknown Source) at com.android.build.gradle.tasks.Lint.lintAllVariants(Lint.groovy:105) at com.android.build.gradle.tasks.Lint$lintAllVariants.callCurrent(Unknown Source) at com.android.build.gradle.tasks.Lint.lint(Lint.groovy:63) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:219) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:212) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:201) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:530) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:513) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) ... 13 more Caused by: java.lang.ClassNotFoundException: java.util.HashMap$Entry ... 28 more ============================================================================== BUILD FAILED Total time: 2 mins 20.757 secs 

I can run gradle build successfully with the -x lint option but want to build without using the commandline options.

6
  • Looks fine to me. Perhaps try allprojects instead of subprojects, or gradle.projectsEvaluated {} instead of subprojects { afterEvaluate {} }. Also double-check that the build is still aborting due to (and not just printing) the lint errors. Commented Jun 26, 2014 at 1:41
  • @PeterNiederwieser Appreciate the response. Tried both those combinations and still getting the same messages above. Commented Jun 26, 2014 at 1:47
  • 1
    This looks more like a fatal error executing the lint task, rather than a lint error. Can you post the stack trace? Commented Jun 26, 2014 at 1:51
  • @PeterNiederwieser there is a Java Class Def not found in the stacktrace. It's happening with six other libraries in the same way... Commented Jun 26, 2014 at 2:01
  • I suggest to report this at code.google.com/p/android/issues/list. Commented Jun 26, 2014 at 2:08

1 Answer 1

19

I too faced a similar situation, but instead of just modifying the DSL directly, I called configure on it instead:

configure(android.lintOptions) { abortOnError false } 

As a result, I was able to disable abortOnError for my desired subprojects. Bottom line, your subproject block should look like this:

subprojects { afterEvaluate { if (getPlugins().hasPlugin('android') || getPlugins().hasPlugin('android-library')) { println name // for debugging configure(android.lintOptions) { abortOnError false } } } } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.