Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede bağımlılık sürümü çakışmaları ve bunların nasıl giderilir açıklanmaktadır.
Java için Azure istemci kitaplıkları, aşağıdakiler gibi popüler üçüncü taraf kitaplıklarına bağlıdır:
Birçok Java uygulaması ve çerçevesi bu kitaplıkları doğrudan veya geçişli olarak kullanır ve bu da version çakışmalarına yol açar. Maven ve Gradle gibi bağımlılık yöneticileri, tüm bağımlılıkları çözümleyip sınıf yolu üzerindeki her bağımlılığın yalnızca tek bir sürümünü oluşturur. Ancak, çözümlenen bağımlılık sürümünün uygulamanızdaki bu bağımlılığın tüm tüketicileriyle uyumlu olduğu garanti değildir. Daha fazla bilgi için Maven belgelerindeki Bağımlılık Mekanizmasına Giriş ve Gradle belgelerindeki Bağımlılık çözümünü anlama konularına bakın.
Doğrudan bağımlılıkların API uyumsuzluğu derleme hatalarına neden olur. Elmas bağımlılığı uyumsuzluğu genellikle NoClassDefFoundError, NoSuchMethodError veya diğer LinkageError gibi çalışma zamanı hatalarına neden olur. Tüm kitaplıklar semantik sürüm oluşturma işlemini kesinlikle izlemez ve hataya neden olan değişiklikler bazen aynı ana sürümde gerçekleşir.
Sürüm uyuşmazlığı sorunlarını tanılama
Aşağıdaki bölümlerde, sürüm uyuşmazlığı sorunlarını tanılama yöntemleri açıklanmaktadır.
Java derleme aracı için Azure SDK kullanma
Azure SDK ve Apache Maven ile çalışmaya başlama makalesinde tanıtılan Azure SDK Java derleme aracı, sık karşılaşılan sorunları belirlemenize yardımcı olur. Bu derleme aracını projenize eklemenizi ve maven hedefini azure:run normal derleme sürecinize ekleyerek çalıştırmanızı öneririz. Uygun yapılandırmayla, bağımlılık çakışmalarını çalışma zamanında sorun haline gelmeden önce daha proaktif bir şekilde tanımlayabilir ve çözebilirsiniz.
Bağımlılık ağacını görüntüleme
Uygulamanızın tam bağımlılık ağacını sürüm numaralarıyla göstermek için veya mvn dependency:tree komutunu çalıştırıngradle dependencies --scan.
mvn dependency:tree -Dverbose daha fazla bilgi verir, ancak yanıltıcı olabilir. Daha fazla bilgi için Maven belgelerindeki Apache Maven Bağımlılık Ağacı'na bakın. Sürüm çakışması olduğundan şüphelendiğiniz her kitaplık için sürüm numarasını not edin ve hangi bileşenlerin buna bağlı olduğunu belirleyin.
Geliştirme ve üretim ortamlarında bağımlılık çözümü farklı çalışabilir. Apache Spark, Apache Flink, Databricks ve IDE eklentilerinin özel bağımlılıklar için ek yapılandırmaya ihtiyacı vardır. Ayrıca Azure İstemci kitaplıklarının veya ortak bileşenlerin kendi sürümlerini de getirebilirler. Daha fazla bilgi için aşağıdaki makalelere bakın:
- Apache Spark için Uygulamanızın Bağımlılıklarını Paketleme
- Apache Flink için Proje Yapılandırması
- Databricks için Databricks'te Maven kitaplığını doğru güncelleştirme
Bu tür ortamlarda çakışma çözümü hakkında daha fazla bilgi için bu makalenin devamında yer alan Fat JAR oluşturma bölümüne bakın.
Azure Functions'ı yapılandırın
Azure Functions'da iç bağımlılık sürümü (yalnızca Java 8 çalıştıran) kullanıcı tarafından sağlanan sürümden önceliklidir. Bu bağımlılık özellikle Jackson, Netty ve Reactor ile sürüm çakışmalarını neden olur.
Bu sorunu çözmek için ortam değişkenini FUNCTIONS_WORKER_JAVA_LOAD_APP_LIBS veya trueolarak 1 ayarlayın. Azure İşlev Araçları'nı (v2 veya v3) en son sürüme güncelleştirin.
Uyarı
Bu yapılandırma yalnızca Java 8 çalıştıran Azure Functions için geçerlidir, Java 11 çalıştıran işlevler için özel yapılandırma gerekmez.
Apache Spark'ı yapılandırma
Java için Azure SDK Jackson'ın birden çok sürümünü destekler, ancak bazen derleme araçlarınıza ve bağımlılık çözümleme sıralamasına bağlı olarak sorunlar ortaya çıkabilir. Bu sorunun iyi bir örneği, Jackson 2.10'a bağlı olan Apache Spark, sürüm 3.0.0 ve üzeridir. Java için Azure SDK uyumlu olsa da, geliştiriciler genellikle jackson'ın daha yeni bir sürümünün kullanıldığını keşfeder ve bu da uyumsuzluklara neden olur. Bu sorunu azaltmak için Jackson'ın (Spark ile uyumlu olan) belirli bir sürümünü sabitlemeniz gerekir. Daha fazla bilgi için bu makaledeki Birden çok Jackson sürümü için destek bölümüne bakın.
Spark'ın önceki sürümlerini kullanıyorsanız veya kullandığınız başka bir kitaplık jackson'ın Java için Azure SDK desteklemediği daha eski bir sürümünü gerektiriyorsa, olası risk azaltma adımları için bu makaleyi okumaya devam edin.
Jackson çalışma zamanı sürümünü algılama
Azure Core 1.21.0'da Jackson çalışma zamanı sürümünün çalışma zamanı algılamasını ve daha iyi tanılamalarını ekledik.
Jackson API veya alt sınıflarından herhangi biriyle ilgili LinkageError görüyorsanız, çalışma zamanı sürüm bilgileri için özel durum iletisini kontrol edin. Örneğin: com.azure.core.implementation.jackson.JacksonVersionMismatchError: com/fasterxml/jackson/databind/cfg/MapperBuilder Package versions: jackson-annotations=2.9.0, jackson-core=2.9.0, jackson-databind=2.9.0, jackson-dataformat-xml=2.9.0, jackson-datatype-jsr310=2.9.0, azure-core=1.19.0-beta.2
Uyarı ve hata günlüklerini JacksonVersion'den bakın. Daha fazla bilgi için bkz. Azure SDK for Java'da loglamayı yapılandırma. Örneğin: [main] ERROR com.azure.core.implementation.jackson.JacksonVersion - Version '2.9.0' of package 'jackson-core' is not supported (too old), please upgrade.
Uyarı
Tüm Jackson paketlerinin aynı sürüme sahip olup olmadığını kontrol edin.
Azure SDK tarafından kullanılan paketlerin listesi ve desteklenen Jackson sürümleri için, birden çok Jackson sürümüne destek bölümüne bakabilirsiniz.
Sürüm uyuşmazlığı sorunlarını azaltma
Aşağıdaki bölümlerde sürüm uyuşmazlığı sorunlarının nasıl azaltıldığı açıklanmaktadır.
Azure SDK BOM kullanma
En son kararlı Azure SDK BOM kullanın ve POM dosyanızda Azure SDK ve bağımlılık sürümlerini belirtmeyin. Uygun olduğunda Azure Spring Boot BOM kullanın.
Azure SDK ürün reçetesinde listelenen bağımlılıklar, bağımlılık çakışmalarını önlemek için sıkı bir şekilde test edilir.
Gereksiz bağımlılıklardan kaçının
Yapabilirseniz bağımlılıkları kaldırın. Bazen, bir uygulamanın temelde aynı işlevselliği sağlayan birden çok kitaplıkta bağımlılıkları vardır. Bu tür gereksiz bağımlılıklar uygulamaları güvenlik açıklarına, sürüm çakışmalarına ve destek ve bakım maliyetlerine maruz bırakır.
Bağımlılık sürümlerini güncelleştirme
En son Azure SDK ürün reçetesine geçmek işe yaramazsa, çakışmalara neden olan kitaplıkları ve bunları kullanan bileşenleri belirleyin. (Daha fazla bilgi için bu makalenin önceki bölümlerinde yer alan Bağımlılık ağacını görüntüleme bölümüne bakın.) Güvenlik açıklarına karşı koruma sağlayan ve genellikle yeni özellikler, performans iyileştirmeleri ve hata düzeltmeleri getiren daha yeni bir sürüme güncelleştirmeyi deneyin.
Uygulamanızı bilinen güvenlik açıklarına ve sorunlara maruz bırakabileceğinden Azure SDK sürümünü düşürmekten kaçının.
Kitaplıkları gölgelendirme
Bazen birlikte çalışan kitaplıkların bir kombinasyonu yoktur ve gölgelendirme son çare olarak başvurulur.
Uyarı
Gölgelendirmenin önemli dezavantajları vardır: sınıf yolundaki paket boyutunu ve sınıf sayısını artırır, kod gezintisini ve hata ayıklamayı zorlaştırır, JNI kodunun yerini değiştirmez, yansımayı keser ve diğer şeylerin arasında kod lisanslarını ihlal edebilir. Yalnızca diğer seçenekler tükendikten sonra kullanılmalıdır.
Gölgelendirme, derleme zamanında JAR'a bağımlılıklar eklemenize, ardından paketleri yeniden adlandırmanıza ve uygulama kodunu gölgeli konumdaki kodu kullanacak şekilde güncelleştirmenize olanak tanır. Bir bağımlılığın iki farklı kopyası olduğundan elmas bağımlılık çatışması artık bir sorun değildir. Aşağıdaki listede açıklandığı gibi, çakışan geçişli bağımlılığı veya doğrudan uygulama bağımlılığı olan bir kitaplığı gölgelendirmeniz gerekebilir:
-
Transitive bağımlılık çakışması: Örneğin, üçüncü taraf kitaplık
AJackson 2.9 gerektirir, ki bu Azure SDK'lerinin desteklemediği bir sürümdür, veAgüncellenemez.Aiçeren, Jackson 2.9'u ve isteğe bağlı olarakAüzerindeki diğer bağımlılıkları gölgeleyen (yeniden yerleştiren) yeni bir modül oluşturun. - Uygulama bağımlılığı çakışması: Uygulamanız doğrudan Jackson 2.9 kullanıyor. Kodunuzu güncelleştirmeye çalışırken Jackson 2.9'u yeniden konumlandırılmış Jackson sınıflarıyla yeni bir modülde gölgeleyebilir ve yeniden konumlandırabilirsiniz.
Uyarı
Taşınmış Jackson sınıflarıyla fat JAR oluşturmak, bu örneklerde bir sürüm çakışmasını çözmez; sadece Jackson'ın tek bir gölge sürümünü zorlar.
Fat JAR oluşturma
Databricks veya Apache Spark gibi ortamlar özel bağımlılık yönetimine sahiptir ve Jackson gibi ortak kitaplıklar sağlar. Sağlanan kitaplıklarla çakışmayı önlemek için tüm bağımlılıkları içeren bir fat JAR oluşturmak isteyebilirsiniz. Daha fazla bilgi için bkz. Apache Maven Shade Eklentisi. Çoğu durumda Jackson sınıflarını (com.fasterxml.jackson) yeniden konumlandırmak sorunu azaltır. Bazen bu tür ortamlar kendi Azure SDKs sürümünü de getirir, bu nedenle sürüm çakışmalarını geçici olarak çözmek için com.azure ad alanını yeniden taşımak zorunda olabilirsiniz.
Uyumlu bağımlılık sürümlerini anlama
Özel bağımlılıklar ve sürümleri hakkında azure-corebilgi için Maven Central Repository'de azure-core bölümüne bakın. Aşağıdaki tabloda bazı genel noktalar gösterilmektedir:
| Bağımlılık | Desteklenen sürümler |
|---|---|
| Jackson | 2.10.0 ve daha yeni ikincil sürümler uyumludur. Daha fazla bilgi için Birden Çok Jackson Sürümü Desteği bölümüne bakın. |
| SLF4J | 1.7.* |
| netty-tcnative-boringssl-static | 2.0.* |
| netty-ortak | 4.1.* |
| reaktör çekirdeği | 3.X.* - Ana ve ikincil sürüm numaraları, sürümünüzün azure-core bağımlı olduğu numaralarla tam olarak eşleşmelidir. Daha fazla bilgi için bkz. Kullanımdan kaldırmalarla ilgili Project Reactor ilkesi. |
Birden çok Jackson sürümü desteği
Java için Azure SDK çeşitli Jackson sürümleriyle çalışmayı destekler. Desteklenen en düşük sürüm Jackson 2.10.0 sürümüdür. Java istemci kitaplıkları için Azure SDK, çalışma zamanında algılanan sürüme bağlı olarak yapılandırmalarını ve Jackson kullanımını ayarlar. Bu ayar Spring çerçevesinin, Apache Spark'ın ve diğer yaygın ortamların eski sürümleriyle daha fazla uyumluluk sağlar. Uygulamalar, Java istemci kitaplıkları için Azure SDK bozmadan Jackson sürümlerini (2.10.0 veya üzeri sürümlere) düşürebilir.
Uyarı
Jackson'ın eski sürümlerini kullanmak uygulamaları bilinen güvenlik açıklarına ve sorunlara maruz bırakabilir. Daha fazla bilgi için Jackson kitaplıkları için bilinen güvenlik açıklarının listesine bakın.
Jackson'ın belirli bir sürümünü sabitlerken, aşağıdaki listede gösterilen Azure SDK tarafından kullanılan tüm modüller için bunu yaptığınızdan emin olun:
jackson-annotationsjackson-corejackson-databindjackson-dataformat-xmljackson-datatype-jsr310
Jackson'dan azure-json'a geçiş
Java için Azure istemci kitaplıkları azure-json geçiş sürecindedir. Bu, üçüncü taraf bileşenlerine bağımlı değildir ve JSON için paylaşılan temel öğeler, soyutlamalar ve yardımcılar sunar.
Apache Spark, Apache Flink ve Databricks gibi ortamlar, henüz azure-core'e bağımlı olmayan eski sürümlerini azure-json getirebilir. Sonuç olarak, bu tür ortamlarda Azure kitaplıklarının daha yeni sürümlerini kullanırken java.lang.NoClassDefFoundError: com/azure/json/JsonSerializable gibi hatalar alabilirsiniz. üzerinde azure-jsonaçık bir bağımlılık ekleyerek bu hatayı azaltabilirsiniz.
Sonraki adımlar
Artık bağımlılık sürümü uyuşmazlıklarını ve bunları gidermeyi bildiğinize göre, bunları önlemenin en iyi yolu hakkında daha fazla bilgi için bkz. Java için Bağımlılık Yönetimi.