Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Java开发自定义Gradle插件_Java_Android_Gradle_Android Gradle Plugin_Gradle Plugin - Fatal编程技术网

如何用Java开发自定义Gradle插件

如何用Java开发自定义Gradle插件,java,android,gradle,android-gradle-plugin,gradle-plugin,Java,Android,Gradle,Android Gradle Plugin,Gradle Plugin,我正在尝试使用Java(而不是Groovy)开发一个定制的Gradle插件 我使用这个Groovy插件作为指南 @Override void apply(Project project) { def hasApp = project.plugins.withType(AppPlugin) def hasLib = project.plugins.withType(LibraryPlugin) if (!hasApp &&am

我正在尝试使用Java(而不是Groovy)开发一个定制的Gradle插件

我使用这个Groovy插件作为指南

    @Override
    void apply(Project project) {
        def hasApp = project.plugins.withType(AppPlugin)
        def hasLib = project.plugins.withType(LibraryPlugin)
        if (!hasApp && !hasLib) {
            throw new IllegalStateException("'android' or 'android-library' plugin required.")
        }

        final def log = project.logger
        final def variants
        if (hasApp) {
            variants = project.android.applicationVariants
        } else {
            variants = project.android.libraryVariants
        }

        project.dependencies {
            debugCompile 'com.jakewharton.hugo:hugo-runtime:1.2.2-SNAPSHOT'
            // TODO this should come transitively
            debugCompile 'org.aspectj:aspectjrt:1.8.6'
            compile 'com.jakewharton.hugo:hugo-annotations:1.2.2-SNAPSHOT'
        }

        project.extensions.create('hugo', HugoExtension)

        variants.all { variant ->
            if (!variant.buildType.isDebuggable()) {
                log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
                return;
            } else if (!project.hugo.enabled) {
                log.debug("Hugo is not disabled.")
                return;
            }

            JavaCompile javaCompile = variant.javaCompile
            javaCompile.doLast {
                String[] args = [
                        "-showWeaveInfo",
                        "-1.5",
                        "-inpath", javaCompile.destinationDir.toString(),
                        "-aspectpath", javaCompile.classpath.asPath,
                        "-d", javaCompile.destinationDir.toString(),
                        "-classpath", javaCompile.classpath.asPath,
                        "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)
                ]
                log.debug "ajc args: " + Arrays.toString(args)

                MessageHandler handler = new MessageHandler(true);
                new Main().run(args, handler);
                for (IMessage message : handler.getMessages(null, true)) {
                    switch (message.getKind()) {
                        case IMessage.ABORT:
                        case IMessage.ERROR:
                        case IMessage.FAIL:
                            log.error message.message, message.thrown
                            break;
                        case IMessage.WARNING:
                            log.warn message.message, message.thrown
                            break;
                        case IMessage.INFO:
                            log.info message.message, message.thrown
                            break;
                        case IMessage.DEBUG:
                            log.debug message.message, message.thrown
                            break;
                    }
                }
            }
        }
    }
}
我开发这个是为了检查Android应用程序/Android库

 final PluginCollection hasAndroidAppPlugin = project.getPlugins().withType(AppPlugin.class);
        final PluginCollection hasAndroidLibraryPlugin = project.getPlugins().withType(LibraryPlugin.class);
        if (hasAndroidAppPlugin.isEmpty() & hasAndroidLibraryPlugin.isEmpty()) {
            throw new IllegalStateException("'android' or 'android-library' plugin required.");
        }
这是用来设置依赖项的

final DependencyHandler dependencyHandler = project.getDependencies();
        dependencyHandler.add("debugCompile", "com.example.perspective:perspective-runtime:0.0.1");
        dependencyHandler.add("debugCompile", "org.aspectj:aspectjrt:1.8.10.3");
如何使用Java实现以下功能

我一直在尝试识别“变体”,例如应用程序变体/库变体

if (hasApp) {
            variants = project.android.applicationVariants
        } else {
            variants = project.android.libraryVariants
        }

免责声明:我熟悉Gradle,而不是Android

我猜
android
属性是一个扩展对象。看到和

如果你把这个println放到android版本中

println "${project.android.class.name}" 
您将看到扩展对象是什么类型。那你就可以了

AndroidModel aModel = getProject().getExtensions().getByType(AndroidModel.class)
我在这里使用的是
AndroidModel
,您将用上面println中打印的内容替换它

你也可以这样做

Object aModel = getProject().getExtensions().getByName("android");
System.out.println(aModel.getClass().getName());

当我尝试这个“final Object obj=project.android.getApplicationVariants();”时,你试过project.android.getApplicationVariants()了吗?我的IDE不喜欢“android”,它说它无法使用“project.getAndroid().getApplicationVariants()”解析symbolTry
project.getAndroid().getApplicationVariants()gives无法解析方法“getAndroid()”,我只是猜测,但我认为Lance提供了一个有效的解决方案。println给出了“com.android.build.gradle.AppExtension_Decorated”,我使用了“import com.android.build.gradle.AppExtension;”,AppExtension允许我调用最终对象obj=AppExtension.getApplicationVariants();