Android Studio Gradle:执行静态Java方法(从ANT迁移到Gradle)

我正在尝试从构建过程的build.gradle脚本asp art中运行java类的静态main方法。 我在Android / Gradle插件’com.android.tools.build:gradle:1.0.0’中使用Android Studio 1.0.2

我想在构建期间运行的主要方法的java类位于… \ trunk-gradle \ myproject \ src \ main \ java \ de \ myapp \ gradle

package de.myapp.gradle; public class ConfigureCustomer { public static void main(String[] args){ String server = args[0]; String customer = args[1]; System.out.println(String.format("Configuring customer %s with server %s", customer, server)); } } 

在我使用ANT调用该java方法之前,如下所示:

        

但是现在我正在迁移到Groovy,所以这里是我的项目的build.gradle文件的相关部分,它试图执行上面的类的主要方法(实际任务定义就在依赖项之前):

 apply plugin: 'com.android.application' android { project.ext.set("customer", "") project.ext.set("server", "") dexOptions { preDexLibraries = false } compileSdkVersion 19 buildToolsVersion "21.1.2" defaultConfig { //Default configuration } signingConfigs { release { //Configuration for release builds } } buildTypes { debug{ server = "test" } release { server = "release" } } productFlavors { customerA{ customer = "a" } customerB{ customer = "b" } customerC{ customer = "c" } } } task (configureCustomer, type: JavaExec) { println 'Running customer configuration...' main = 'de.myapp.gradle.ConfigureCustomer' args customer, server } dependencies { //Dependency settings } 

所以现在当我通过命令行(windows)运行以下命令时:

 graldew configureCustomer 

我收到以下错误消息:

错误:无法找到或加载主类de.myapp.gradle.ConfigureCustomer

我的问题如下:

  1. 如何设法修复上面的错误消息? 我是否必须将我的java类移动到另一个文件夹? 也许在构建scipt中配置?
  2. 在实际编译类之后,如何确保执行java任务?
  3. 如果我想将任务configureCustomer作为另一个任务的一部分执行,我是否只需在gradle的任务定义中编写以下行?

configureCustomer

我还尝试添加类路径:

 task (configureCustomer, type: JavaExec) { println 'Running customer configuration...' main = 'de.myapp.gradle.ConfigureCustomer' classpath = sourceSets.main.runtimeClasspath args customer, server } 

但所有这些让我得到了一个gradle构建错误消息:

无法在SourceSet容器上找到属性“main”

显然,Android Studio的Gradle中不存在“sourceSets.main.runtimeClasspath”。 也许它的名字不同。 虽然我也试过像这样设置类路径:

 classpath = '${projectDir.getAbsolutePath()}\\build\\intermediates\\classes\\' + customer + '\\release' 

我也试过这个:

 classpath = '${projectDir.getAbsolutePath()}\\build\\intermediates\\classes\\' + customer + '\\release\\de\\myapp\\gradle' 

没有一个工作,上面的错误仍然存​​在:

错误:无法找到或加载主类de.myapp.gradle.ConfigureCustomer

我终于发现了一些适用于Android / Gradle的东西,但是到了那里似乎要复杂得多。

所以回顾一下 – 这里是我想要执行的主要方法的Java类:

包de.myapp.gradle;

 public class ConfigureCustomer { public static void main(String[] args){ String customer = args[0]; String versionName = args[1]; System.out.println(String.format("Configuring customer %s with versionName %s", customer, versionName )); } } 

我想为每种风格执行上述操作,并且仅针对发布版本(而不是调试版本)执行以上操作,因此这是我的任务定义(您仍然必须使您的任务依赖于其中一个gradle构建任务,因此它已执行 – 我依赖在为此目的的preBuild任务上):

 android { //Build type setup, signing configuration and other stuff } //After the android block my task definition follows: task buildPrintout(type: JavaExec) { android.applicationVariants.all { variant -> //Runt he java task for every flavor variant.productFlavors.each { flavor -> println "Triggering customer configuration for flavor " + flavor.name if (variant.buildType.name.equals('release')) { //Run the java task only for release builds //Cant find the runtime classpath in android/gradle so I'll directly link to my jar file here. The jarfile contains the class I want to run (with the main method) classpath += files("libs/my-jarfile.jar") //This is the fully qualified name of my class, including package name (de.myapp.gradle) and the classname (ConfigureCustomer) main = "de.myapp.gradle.ConfigureCustomer" //Pass in arguments - in this case the customer's name and the version name for the app (from AndroidManifest.xml) args flavor.name, variant.versionName } } } } 

您会注意到我倾向于将我的类集成到我即将构建的android项目中。 相反,我让一个类成为一个单独的项目,构建一个jar文件并将其放在我正在构建的android项目的libs文件夹中。

更新04.02.2015

我稍微修改了上面的内容,使用javaexec方法而不是JavaExec Task类型:

 preBuild.doFirst { android.applicationVariants.all { variant -> variant.productFlavors.each { flavor -> if (variant.buildType.name.equals('release')) { javaexec { println "Triggering customer build for flavor " + flavor.name classpath += files("libs/my-jarfile.jar") main = "de.myapp.gradle.ConfigureCustomer" args flavor.name, variant.versionName } println "Done building customer for flavor " + flavor.name } } } } 

这是另一种变体,我们在可重用(优先)任务中定义javaexec,然后我们将其作为依赖项添加到preBuild任务:

 //Define our custom task and add the closures as an action task buildCustomer << { android.applicationVariants.all { variant -> variant.productFlavors.each { flavor -> if (variant.buildType.name.equals('release')) { javaexec { println "Triggering customer build for flavor " + flavor.name classpath += files("libs/my-jarfile.jar") main = "de.myapp.gradle.ConfigureCustomer" args flavor.name, variant.versionName } println "Done building customer for flavor " + flavor.name } } } } //Make preBuild depend on our task preBuild.dependsOn buildCustomer 

如果您有任何问题,请告诉我,我会尽力回答。

更改配置类路径的方式

 classpath(files('build/intermediates/classes/release',"${android.getSdkDirectory().getAbsolutePath() + '/platforms/' + android.compileSdkVersion + '/android.jar'}")) 

它适用于android gradle 1.5