2015-02-16 16 views
7

In Groovy è possibile testare collezioni per nulla e vuota semplicemente posizionando il variabile da solo all'interno di se come:Groovy CompileStatic su Android scombina Groovy verità

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

Tuttavia upon immissione @CompileStatic sulla classe che contiene il codice come questo, smette di funzionare (ma solo su Android) con un errore:

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: [] 

questo non sembra verificarsi quando si esegue la versione desktop.

Per dare più contesto. Questo è un progetto LibGDX generato con tre progetti (-core, -desktop, -android) in cui il progetto -core è stato convertito in un progetto groovy. Il progetto -core è referenziato e una dipendenza di entrambi i progetti -desktop e -android

La versione desktop funziona senza problemi indipendentemente dal fatto che le classi siano annotate con annotazione @CompileStatic e la verità di Groovy sia correttamente riconosciuta.

Su Android, d'altra parte, si verifica l'errore di cui sopra.

Non sto utilizzando la libreria grooid perché il progetto che è convertito in groovy è condiviso tra desktop e android.

Se si tratta di qualche valore, qui ci sono i contenuti della build.gradle sul livello di progetto:

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" 
} 

risposta

4

È necessario utilizzare la versione "grooid" di Groovy per tutti i moduli, altrimenti avrete codice generato che utilizza un runtime targetted alle normali JVM. Penso che usare "2.4.1-grooid" per tutti i tuoi moduli sia buono.

+0

Sembra che ci siano problemi con i percorsi del repository grooid, 'compile 'org.codehaus.groovy: groovy: 2.4.1: grooid'' in gradle produce un percorso diverso rispetto al vero percorso di dipendenza quindi non posso davvero testarlo . Quando capisco cosa c'è che non va e come risolverlo proverò la tua soluzione e distribuirò la taglia in modo appropriato. Grazie per l'aiuto. – MrPlow

+0

Stai includendo la dipendenza groovy-all dal core nel tuo progetto Android. Questo deve essere escluso poiché i barattoli groovy-all e grooid non possono essere compilati insieme. – Pieces