Ortalama 1,5 yıl ara verdikten sonra yeniden yazı yazmaya başlayınca nasıl bir giriş yapacağım konusunda bi hayli düşünmek zorunda kaldım. Neyse bir şekilde giriş yaptık sanırım 🙂
Hemen problemimizi tanımakla başlayalım..
Android geliştiriciler gayet iyi bilir ki işe başlamadan Android SDK içindeki lisansları onaylamak gerekiyor. Bunun için gerekli kurumları ve yol ayarlarını yaptıktan sonra aşağıdaki komutu çalıştırmak yeterlidir. Ardından tek tek onaylamak gerekiyor.
Komutumuzu çalıştırıyoruz…
sdkmanager --licenses
1
sdkmanager --licenses
…ve sonuç hüsran 🙂
Android SDK License Error
Gördüğünüz gibi Java tarafından bir hata fırlatıldı.
Şimdi bir de Flutter tarafına bakalım. Flutter geliştiricileri de Android SDK ile geliştirme yaptıkları için aynı hata ile karşılaşmaktadırlar.
Komutumuzu çalıştırıyoruz…
flutter doctor --android-licenses
1
flutter doctor --android-licenses
…ve sonuç yine hüsran 🙂
Flutter Doctor Android SDK License Error
Gördüğünüz gibi ikisi de aynı hata mesajını fırlattı. Sorunu çözebilmek için ilk önce sorunun gerçekten nereden kaynaklandığını anlamamız gerekiyor.
Android SDK Error
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156) at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75) at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 5 more
1
2
3
4
5
6
7
8
9
10
11
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 5 more
Hata mesajını dikkatlice inceleyecek olursak çok güzel bir ipucu görebiliriz.
javax/xml/bind/annotation/XmlSchema
1
javax/xml/bind/annotation/XmlSchema
Bu hatayı Java geliştiricileri bir süredir çok iyi biliyorlar. Java dilini geliştirenler bir gün terslerinden kalkmışlar ve demişler ki bu Android geliştiricileri dertsiz tasasız kod yazıyorlar. Biz en iyisi bu geliştiricilerin başına tatlı bir bela açalım da sık sık bizi akıllarına getirsinler. Tabi bu işin latifesi 🙂
Sorunun kaynağı tam olarak burada anlatılmış.
Java XML (JAXB) Module Error
Resim koyma kaynak ver dediğinizi duyar gibiyim. İşte buyrun kaynak linki : https://stackoverflow.com/a/52502208
Sorunun sebebini anladığımıza göre şimdi bizdeki kaynağını tespit edelim. Bunun için sistemde kurulu olan Java sürümüne bakmamız gerekiyor.
Java Default Version
Gördüğünüz gibi benim sistemde Java’nın 13. sürümü kurulu. Hatanın kaynağı da tam olarak burası oluyor. Java’nın 13. sürümünde JAXB paketi olmadığı için hata veriyor.
Sorunu çözmek için en basit yöntem sisteminizde kurulu olan aktif Java sürümünü 8 olarak değiştirmektir. Bunun için ya tüm sürümleri kaldırıp Java 8’i kurabilirsiniz ya da işletim sisteminize uygun biçimde geçerli sürümü 8 yaparsınız. İkisi de sorunu çözecektir.
Ben bu yoldan değil de daha uzun bir yoldan ilerlemeyi tercih ettim. Benim sistemde gördüğünüz gibi 3 farklı sürüm kurulu.
Java Versions
Ben kendi işlerim gereği 3 sürümü de saklamalıyım. Bu nedenle sadece Java 8’i kuramam.
Sorunu biraz daha derinlemesine incelediğimde sorunun kaynağının sdkmanager olduğunu gördüm. Sorun madem sadece sdkmanager tarafında çıkıyor o zaman tüm sistemi etkileyecek bir değişik yapmak yerine sadece sorunun kaynağına yönelik çözüm üretmek daha doğru bir tercih olur diyerek sdkmanager dosyasını incelemeye karar verdim.
İşletim sistemine göre ve yazılımcının tercihine göre Android SDK’nın konumu değişmektedir. Bu nedenle siz de kendi sisteminizde kurulu olan Android SDK klasörünü açın. Ardından o klasör içindekitools/bin/ klasörünü açın.
Örnek olması için benim sistemdeki tam yolu inceleyebilirsiniz.
/Volumes/Backup/Workspace/Libraries/android/sdk/tools/bin/
1
/Volumes/Backup/Workspace/Libraries/android/sdk/tools/bin/
Eğer bin/ klasörüne ulaşabildiyseniz artık sdkmanager dosyasını düzenleyebiliriz. Sisteminizde kurulu olan herhangi bir metin editörü ile bu sdkmanager dosyasını açın.
sdkmanager Content
Gördüğünüz gibi 69. satırdan 89. satıra kadar işaretledim. Kodu biraz incelediğimizde JAVACMD değişkenine Java’nın geçerli sürümünün yolu atanmış. Demek ki burada bir değişiklik yaparsak sistemdeki diğer tarafları etkilemeden doğruca sdkmanager‘a özel bir değişiklik yapmış oluruz.
Buraya kadar geldikten sonra artık yapacak pek fazla iş kalmamış oluyor. Şimdi eğer sisteminizde Java 8 sürümü yoksa önce onu kurmanız gerekiyor. Kurulumun ardından tekrar aşağıdaki komutla kurulu sürümleri kontrol edin.
Java Versions
Gördüğünüz gibi kurulu sürümlerin klasör yolları da yanında yazıyor. Buradan Java 8’in yolunu kopyalayın. Ardından aşağıdaki adımları takip edin.
Böyleydi : /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home
Bunun ekledim: /bin/java
Böyle oldu: /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/bin/java
Siz de kendi sisteminize göre yolunuzu oluşturduktan aşağıdaki gibi değişkene atayın.
JAVACMD="/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/bin/java"
1
JAVACMD="/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/bin/java"
Son olarak oluşturduğumuz değişkeni 89. satırın altına ekleyin.
sdkmanager Content With Java 8 Path
sdkmanager açılırken sistemden Java yolunu isteyecektir. Varsayılan Java sürümü ne olursa olsun atamanın ardından biz tekrar o sürümü Java 8 ile değiştirmiş olacağız. Böylelikle sorunu sdkmanager‘a özel çözmüş olacağız.