Android und Gradle NoClassDefFoundError

  • Antworten:4
  • Bentwortet
Markus B.
  • Forum-Beiträge: 636

16.08.2013, 22:53:55 via Website

Hallo,
ich hab da gerade ein Problem mit gradle.
Ich möchte eine jar als dependency hinzufügen, welche lokal auf meinem Rechner liegt. Also nicht bei maven central oder so ( Libs die von dort geladen werden funktionieren). Die lokale jar habe ich zuerst ins lokale maven repository gepackt und dachte mir wird gradle dann schon laden, ist aber nicht so.
Somit habe ich die jar nun von Hand in das Libs-Verzeichnis gepackt.
Kompilieren kann ich das Projekt und die IDE ( Android Studio 0.2.4 ) erkennt die lokalen Libs auch. Somit sollte mit dem classpath eigentlich alles passen.

Gradle-File:

1buildscript {
2 repositories {
3 mavenCentral()
4 }
5 dependencies {
6 classpath 'com.android.tools.build:gradle:0.5.+'
7 }
8}
9apply plugin: 'android'
10
11repositories {
12 mavenCentral()
13}
14
15android {
16 compileSdkVersion 18
17 buildToolsVersion "17.0.0"
18
19 defaultConfig {
20 minSdkVersion 18
21 targetSdkVersion 18
22 }
23}
24
25dependencies {
26 compile 'com.android.support:support-v4:13.0.+'
27 compile 'com.google.android.gms:play-services:3.2.25'
28 compile 'com.google.code.gson:gson:2.2.4'
29
30 // Lokale Lib
31 compile files('libs/android-async-http-trunk.jar')
32}

Baue ich nun das Projekt und schiebe es auf ein Android device erhalte ich die Meldung:

108-16 22:43:07.104 22801-22801/? E/AndroidRuntime: FATAL EXCEPTION: main
2 java.lang.NoClassDefFoundError: com.loopj.android.http.AsyncHttpClient
3 at de.cause.i.can.activity.Main$1.<init>(Main.java:52)
4 at de.cause.i.can.activity.Main.<init>(Main.java:49)
5 at java.lang.Class.newInstanceImpl(Native Method)

Somit komm die lokale Lib nicht mit in die apk. Gson hingegen macht keine Probleme.
Hat zufällig jmd. eine Idee ?

Gruß,
Markus

Antworten
Markus B.
  • Forum-Beiträge: 636

17.08.2013, 22:37:20 via Website

Soooooo ich hab es nun endlich:

settings.gradle
1include ..... ':libraries:android-async-http-1.4.3'

Da es sich bei android-async-http um ein library-Projekt handelt muss dieses dort eingetragen werden.
Dann ist die Lib auch auf dem device :)

— geändert am 17.08.2013, 22:37:31

Antworten
Markus B.
  • Forum-Beiträge: 636

18.08.2013, 22:35:54 via Website

Noch eine Erweiterung, da neue Erkenntnisse:

Mit gradle kann kann auch einfach ein .aar (Android Archive) erstellt werden. Das kann dann einfach via mvn install:install ... ins lokale repository gepackt werden.
Danach muss im entsprechenden Android Projekt nur noch folgendes in das build.gradle file aufgenommen werden:

1dependencies {
2 compile '<group-id>:<artifact-id>:<version>@aar'
3}

Der Suffix @aar ist wichtig, damit maven nicht nach einer .jar sucht.

Alternativ gehts auch noch etwas "cooler" :) . Man kann z.B. Github direkt als maven repository nutzten.
Das ist z.B. hier beschrieben:
https://github.com/ark/ark/blob/master/README.md

Kleiner Fazit:
Ist am Anfang alles etwas ungewohnt und noch viel Handarbeit ( GUI soll noch kommen ) aber ich lerne gradle zu schätzen :)

— geändert am 18.08.2013, 22:41:04

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.08.2013, 00:36:10 via Website

Na ja, vieles kommt aus der Maven Ecke wenn ich das so lese, ich warte noch etwas :) Oder wenn ich auf grüner Wiese anfange wohl endlich.
Aber cool ist das man die PlayServices z.b deutlich einfacher einbinden kann.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus B.
  • Forum-Beiträge: 636

19.08.2013, 09:47:05 via Website

Ja das mit dem PlayServices ist ne gang coole Geschichte.
Einfach die aktuelle Version per android-tool installieren und dann befindet sich unter <Android-SDK>/extras/google/m2repository einfach ein weiteres Maven repository.

Antworten