5

Korzystanie z najnowszej wersji 4.0.0-rc.1 wtyczki Maven dla Androida, niektóre klasy wydają się być brakujące w kompilacji. I dostać jeden z tych wyjątków, kiedy uruchomić aplikację (dwa sposoby, aby uruchomić aplikację):NoClassDefFoundError z biblioteką pomocy Androida i Maven

  • java.lang.NoClassDefFoundError: android.support.v4.app.TaskStackBuilderHoneycomb
  • java.lang.NoClassDefFoundError : android.support.v4.widget.EdgeEffectCompatIcs

Obie klasy są brakujące wewnątrz support-v4-21.0.0.aar/libs/internal_impl-21.0.0.jar.

Moja definicja zależność:

<dependency> 
     <groupId>com.android.support</groupId> 
     <artifactId>support-v4</artifactId> 
     <version>21.0.0</version> 
     <type>aar</type> 
    </dependency> 

Czy to jakiś błąd w konfiguracji? Błąd w pluginach Androida Maven?

+1

Mogę potwierdzić, że obie klasy są obecne, jeśli użyjesz 'support-v4-21.0.0' przez gradle. –

+0

Po drugie, co powiedział Thomas Keller, działa dobrze z gradle, ale nie maven, próbowałem dowiedzieć się, dlaczego od wielu godzin, tutaj jest problem z przesłaniem do androida repozytorium wtyczki: https: // github.com/jayway/maven-android-plugin/issues/484 – jianinz

+0

Logcat pokazuje, że DexOut nie może przekierowywać wywołań z pliku classes.jar do internal_impl-21.0.0.jar. Wydaje się, że plugin androida działa poprawnie i pobiera wszystkie zależności od aar i pakuje je, jeśli spojrzysz na folder 'target/unpacked-libs/cas_support-v4', ma wszystko, czego potrzebujemy. – jianinz

Odpowiedz

0

znalazłem tymczasowe rozwiązanie:

  • cp support-v4-21.0.0.aar ~/Desktop
  • cd ~/Desktop && mv support-v4-21.0.0.aar support-v4-21.0.0.jar
  • jar xf support-v4-21.0.0.jar

następnie wyciągnij internal_impl-21.0.0.jar z libs folderu i przesłać do własnego artifactory jeśli masz, i zmodyfikuj swój plik pom, powinien zadziałać, jeśli nie masz własnego artefakatu, dodaj go nto classpath.

To działa dla mnie.

10

Musisz ustawić następujące config w pom:

<includeLibsJarsFromAar>true</includeLibsJarsFromAar> 

Tak będzie wyglądać mniej więcej tak:

<plugin> 
    <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
    <artifactId>android-maven-plugin</artifactId> 
    <extensions>true</extensions> 
    <configuration> 
     //... 
     <includeLibsJarsFromAar>true</includeLibsJarsFromAar> 
     //... rest of config 
    </configuration>  
</plugin> 

Powodem tej zmiany jest to, że Google postanowił umieścić słoiki wewnątrz aaru, co jest złym zwyczajem zależności. Jeśli chcesz zastąpić wersję lub coś innego, nie jest to obecnie możliwe. W skrócie sprawia, że ​​zależności są znacznie trudniejsze w zarządzaniu.

To ustawienie jest domyślnie ustawione na wartość false, aby zniechęcić do takiego zachowania tworzenia plików aar z jar w folderze libs.

Aktualizacja:

Korzystanie z najnowszej Android-Maven-Plugin (obecnie 4.2.0) 4.1.1 wkrótce ta flaga jest ustawiona na true domyślnie, więc nie trzeba go dodać więcej.

+0

Dzięki! Próbowałem, działa dobrze! Kolejne pytanie, ponieważ pakiety support-v4 i support-v13 aar są dostarczane z folderem libs, w którym znajduje się ** ten sam ** nazwa pliku jar internal_impl-21.0.0.jar, wtyczka maven-shade odfiltruje jeden z nich, jeśli oba są one używane? Wiesz, aplikacja zawiera bibliotekę z obsługą techniczną v4? – jianinz

+0

Wystąpił problem z uruchomieniem tematu, gdy znaleziono "plik klasy dla pliku android.support.v4.widget.DrawerLayoutImpl". To sprawnie go naprawiło. – riwnodennyk