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
我的问题如下:
- 如何设法修复上面的错误消息? 我是否必须将我的java类移动到另一个文件夹? 也许在构建scipt中配置?
- 在实际编译类之后,如何确保执行java任务?
- 如果我想将任务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
- 如何在使用Android Gradle Plugin进行编译时添加java编译器选项?
- 创建一个gradle依赖项以从git导入
- 按“运行应用程序”时出现Gradle错误 – Android Studio 0.4.3
- 错误:android studio中的任务’:app:dexDebug’执行失败
- 重复条目:gms / auth / api / signin / internal / zzf.class
- 依赖关系未复制到jar中(在Gradle中)
- 在我的`gradle build`上遇到`org.gradle.api.ProjectConfigurationException`错误
- 意外的顶级错误
- 无法从最终类inheritance