Detect java plugin and display a nicer error message.
Xavier Ducrohet [Fri, 15 Mar 2013 19:52:25 +0000 (12:52 -0700)]
The android and Java plugin cannot both be applied but if they
are the error is hard to figure out what the root of the problem
is.

Change-Id: Ia3e76eb2b73c6fb0276593919d2530cbf98df180

gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy
gradle/src/main/groovy/com/android/build/gradle/internal/BadPluginException.java [new file with mode: 0644]
gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy

index 872bf2f..a337811 100644 (file)
  * limitations under the License.
  */
 package com.android.build.gradle
+
 import com.android.SdkConstants
 import com.android.build.gradle.internal.ApplicationVariant
+import com.android.build.gradle.internal.BadPluginException
 import com.android.build.gradle.internal.LoggerWrapper
 import com.android.build.gradle.internal.ProductFlavorData
 import com.android.build.gradle.internal.ProductionAppVariant
@@ -48,15 +50,15 @@ import com.android.build.gradle.tasks.ProcessTestManifest
 import com.android.build.gradle.tasks.RenderscriptCompile
 import com.android.build.gradle.tasks.ZipAlign
 import com.android.builder.AndroidBuilder
-import com.android.builder.dependency.AndroidDependency
 import com.android.builder.DefaultSdkParser
-import com.android.builder.dependency.JarDependency
-import com.android.builder.dependency.ManifestDependency
 import com.android.builder.PlatformSdkParser
 import com.android.builder.ProductFlavor
 import com.android.builder.SdkParser
 import com.android.builder.SourceProvider
 import com.android.builder.VariantConfiguration
+import com.android.builder.dependency.AndroidDependency
+import com.android.builder.dependency.JarDependency
+import com.android.builder.dependency.ManifestDependency
 import com.android.builder.signing.SigningConfig
 import com.android.utils.ILogger
 import com.google.common.collect.ArrayListMultimap
@@ -76,6 +78,7 @@ import org.gradle.api.artifacts.result.ResolvedModuleVersionResult
 import org.gradle.api.internal.plugins.ProcessResources
 import org.gradle.api.logging.LogLevel
 import org.gradle.api.plugins.JavaBasePlugin
+import org.gradle.api.plugins.JavaPlugin
 import org.gradle.api.tasks.Copy
 import org.gradle.api.tasks.compile.JavaCompile
 import org.gradle.internal.reflect.Instantiator
@@ -88,6 +91,7 @@ import static com.android.builder.BuilderConstants.INSTRUMENTATION_RESULTS
 import static com.android.builder.BuilderConstants.INSTRUMENTATION_TEST
 import static com.android.builder.BuilderConstants.INSTRUMENTATION_TESTS
 import static com.android.builder.BuilderConstants.REPORTS
+
 /**
  * Base class for all Android plugins
  */
@@ -172,6 +176,12 @@ public abstract class BasePlugin {
     }
 
     final void createAndroidTasks() {
+        // get current plugins and look for the default Java plugin.
+        if (project.plugins.hasPlugin(JavaPlugin.class)) {
+            throw new BadPluginException(
+                    "The 'java' plugin has been applied, but it is not compatible with the Android plugins.")
+        }
+
         findSdk(project)
 
         if (hasCreatedTasks) {
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/BadPluginException.java b/gradle/src/main/groovy/com/android/build/gradle/internal/BadPluginException.java
new file mode 100644 (file)
index 0000000..4ad6fc3
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.build.gradle.internal;
+
+import com.android.annotations.NonNull;
+import org.gradle.api.GradleException;
+
+public class BadPluginException extends GradleException {
+
+    public BadPluginException(@NonNull String message) {
+        super(message);
+    }
+}
index c1d2918..d7241fc 100644 (file)
@@ -17,6 +17,7 @@
 package com.android.build.gradle
 
 import com.android.build.gradle.internal.ApplicationVariant
+import com.android.build.gradle.internal.BadPluginException
 import com.android.build.gradle.internal.test.BaseTest
 import com.android.build.gradle.internal.test.PluginHolder
 import com.android.builder.BuildType
@@ -403,6 +404,29 @@ public class AppPluginInternalTest extends BaseTest {
         assertEquals(debugSC.getKeyPassword(), fooSC.getKeyPassword());
     }
 
+    public void testPluginDetection() {
+        Project project = ProjectBuilder.builder().withProjectDir(
+                new File(testDir, "basic")).build()
+
+        project.apply plugin: 'android'
+        project.apply plugin: 'java'
+
+        project.android {
+            compileSdkVersion 15
+        }
+
+        AppPlugin plugin = AppPlugin.pluginHolder.plugin
+        Exception recordedException = null;
+        try {
+            plugin.createAndroidTasks()
+        } catch (Exception e) {
+            recordedException = e;
+        }
+
+        assertNotNull(recordedException)
+        assertEquals(BadPluginException.class, recordedException.getClass())
+    }
+
     private static ApplicationVariant findVariant(Collection<ApplicationVariant> variants,
                                                   String name) {
         for (ApplicationVariant variant : variants) {