2015-02-16 3 views
7

В Groovy можно проверить коллекции для нулевой и пустой, просто помещая переменную себя внутри, если как:Groovy CompileStatic на Android путает Groovy Правду

def collection = [ 'test' ] 
if(!collection) { 
    //Collection is either null or empty, handle exceptional business here 
} 

Однако при размещении @CompileStatic на класс, который содержит код, как это, он перестает работать (но только на Android) с ошибкой:

02-16 20:49:03.837: E/AndroidRuntime(9013): org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack: No signature of method: java.util.ArrayList.asBoolean() is applicable for argument types:() values: [] 

Это, кажется, не происходит при запуске настольной версии.

Чтобы предоставить больше контекста. Это сгенерированный проект LibGDX с тремя проектами (-core, -desktop, -android), где проект -core был преобразован в отличный проект. В проекте -core указывается ссылка и зависимости проектов -desktop и -android.

Desktop-версия работает без каких-либо проблем независимо от того, аннотируются ли классы с помощью аннотации @CompileStatic, а Groovy Truth распознается правильно.

С другой стороны, на андроиде возникает вышеупомянутая ошибка.

Я не использую библиотеку grooney, потому что проект, который преобразуется в groovy, делится между обоими и Android.

Если это какой-либо ценности, вот содержание build.gradle на уровне проекта:

buildscript { 
    repositories { 
     mavenCentral() 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.0.0' 
     classpath 'org.codehaus.groovy:gradle-groovy-android-plugin:0.3.5'   
    } 
} 

allprojects { 
    apply plugin: "eclipse" 
    apply plugin: "idea" 

    version = '1.0' 
    ext { 
     appName = 'CastleShuffle' 
     gdxVersion = '1.5.4' 
     roboVMVersion = '1.0.0-beta-04' 
     box2DLightsVersion = '1.3' 
     ashleyVersion = '1.3.1' 
     aiVersion = '1.5.0' 
    } 

    repositories { 
     mavenCentral() 
     jcenter() 
     maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 
     maven { url "https://oss.sonatype.org/content/repositories/releases/" } 
    } 
} 

project(":desktop") { 
    apply plugin: "java" 


    dependencies { 
     compile project(":core") 
     compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" 
     compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" 
     compile "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop" 
     compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" 
    } 
} 

project(":android") { 
    apply plugin: "android" 
    //apply plugin: "groovyx.grooid.groovy-android" 

    configurations { natives } 

    dependencies {   
     compile project(":core")    
     compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" 
     natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" 
     natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" 
     natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" 
     compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" 
     natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi" 
     natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a" 
     natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86" 
     compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" 
     natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi" 
     natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a" 
     natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86" 
    // compile 'org.codehaus.groovy:groovy:2.4.0:grooid' //Adding this causes a Dex exception where groovy class Bindable is referenced multiple times 
    // compile 'org.codehaus.groovy:groovy-all:2.4.0' 
    } 
} 

project(":core") { 
    apply plugin: "groovy"  

    dependencies { 
     compile 'org.codehaus.groovy:groovy-all:2.4.0' 
     compile "com.badlogicgames.gdx:gdx:$gdxVersion" 
     compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" 
     compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" 
    } 
} 

tasks.eclipse.doLast { 
    delete ".project" 
} 

ответ

4

Вы должны использовать «grooid» версию Groovy для всех модулей, в противном случае вы будете иметь код, генерируемый который использует среду выполнения, настроенную на обычные JVM. Думаю, использование «2.4.1-grooid» для всех ваших модулей должно быть хорошим.

+0

Есть, по-видимому, проблемы с путями репозитория grooney, 'compile 'org.codehaus.groovy: groovy: 2.4.1: grooid'' в gradle производит другой путь, чем реальный путь зависимости, поэтому я не могу его проверить , Когда я выясню, что не так, и как исправить это, я попробую ваше решение и правильно распределю его. Спасибо за вашу помощь. – MrPlow

+0

Вы включаете основную зависимость от ядра в свой проект андроида. Это нужно исключить, так как groovy-all и grooid jars не могут быть скомпилированы вместе. – Pieces

Смежные вопросы