| package com.android.build.gradle.tasks.factory; |
| |
| import static com.android.builder.core.VariantType.LIBRARY; |
| import static com.android.builder.core.VariantType.UNIT_TEST; |
| |
| import com.android.build.gradle.internal.CompileOptions; |
| import com.android.build.gradle.internal.scope.ConventionMappingHelper; |
| import com.android.build.gradle.internal.scope.TaskConfigAction; |
| import com.android.build.gradle.internal.scope.VariantScope; |
| import com.android.build.gradle.internal.variant.BaseVariantData; |
| import com.android.builder.dependency.LibraryDependency; |
| import com.google.common.base.Joiner; |
| |
| import org.gradle.api.Project; |
| import org.gradle.api.file.FileCollection; |
| import org.gradle.api.tasks.compile.JavaCompile; |
| |
| import java.io.File; |
| import java.util.concurrent.Callable; |
| |
| /** |
| * Configuration Action for a JavaCompile task. |
| */ |
| public class JavaCompileConfigAction implements TaskConfigAction<JavaCompile> { |
| |
| private VariantScope scope; |
| |
| public JavaCompileConfigAction(VariantScope scope) { |
| this.scope = scope; |
| } |
| |
| @Override |
| public String getName() { |
| return scope.getTaskName("compile", "JavaWithJavac"); |
| } |
| |
| @Override |
| public Class<JavaCompile> getType() { |
| return JavaCompile.class; |
| } |
| |
| @Override |
| public void execute(final JavaCompile javacTask) { |
| final BaseVariantData testedVariantData = scope.getTestedVariantData(); |
| scope.getVariantData().javacTask = javacTask; |
| |
| javacTask.setSource(scope.getVariantData().getJavaSources()); |
| |
| ConventionMappingHelper.map(javacTask, "classpath", new Callable<FileCollection>() { |
| @Override |
| public FileCollection call() { |
| FileCollection classpath = scope.getJavaClasspath(); |
| Project project = scope.getGlobalScope().getProject(); |
| |
| if (testedVariantData != null) { |
| // For libraries, the classpath from androidBuilder includes the library |
| // output (bundle/classes.jar) as a normal dependency. In unit tests we |
| // don't want to package the jar at every run, so we use the *.class |
| // files instead. |
| if (!testedVariantData.getType().equals(LIBRARY) |
| || scope.getVariantData().getType().equals(UNIT_TEST)) { |
| classpath = classpath.plus(project.files( |
| testedVariantData.getScope().getJavaClasspath(), |
| testedVariantData.getScope().getJavaOutputDir(), |
| testedVariantData.getScope().getJavaDependencyCache())); |
| } |
| |
| if (scope.getVariantData().getType().equals(UNIT_TEST) |
| && testedVariantData.getType().equals(LIBRARY)) { |
| // The bundled classes.jar may exist, but it's probably old. Don't |
| // use it, we already have the *.class files in the classpath. |
| LibraryDependency libraryDependency = |
| testedVariantData.getVariantConfiguration().getOutput(); |
| if (libraryDependency != null) { |
| File jarFile = libraryDependency.getJarFile(); |
| classpath = classpath.minus(project.files(jarFile)); |
| } |
| } |
| } |
| |
| return classpath; |
| } |
| }); |
| |
| javacTask.setDestinationDir(scope.getJavaOutputDir()); |
| |
| javacTask.setDependencyCacheDir(scope.getJavaDependencyCache()); |
| |
| CompileOptions compileOptions = scope.getGlobalScope().getExtension().getCompileOptions(); |
| |
| AbstractCompilesUtil.configureLanguageLevel( |
| javacTask, |
| compileOptions, |
| scope.getGlobalScope().getExtension().getCompileSdkVersion() |
| ); |
| |
| javacTask.getOptions().setEncoding(compileOptions.getEncoding()); |
| |
| javacTask.getOptions().setBootClasspath( |
| Joiner.on(File.pathSeparator).join( |
| scope.getGlobalScope().getAndroidBuilder().getBootClasspathAsStrings())); |
| } |
| } |