Maaven kapsam derlemesi ile JAR ambalajı için sağlanan fark


260

Maaven kapsamı compileve providedyapay yapı JAR olarak inşa edildiğinde arasındaki fark nedir ? Eğer savaş olsaydı, anlıyorum - eser WEB-INF / lib'e dahil edilecekti ya da eklenmeyecekti. Ancak bir JAR durumunda önemli değil - bağımlılıklar dahil değildir. Kapsamları compileveya olduğunda sınıfyolunda olmaları gerekir provided. providedBağımlılıkların geçişli olmadığını biliyorum - ama bu sadece bir fark mı?

Yanıtlar:


289

Gönderen Maven Doc :

  • derleme

    Hiçbiri belirtilmezse kullanılan varsayılan kapsam budur. Derleme bağımlılıkları bir projenin tüm sınıf yollarında kullanılabilir. Ayrıca, bu bağımlılıklar bağımlı projelere yayılır.

  • sağlanan

    Bu derleme gibidir, ancak JDK'nın veya bir kapın çalışma zamanında bağımlılık sağlamasını beklediğinizi gösterir. Örneğin, Java Enterprise Edition için bir web uygulaması oluştururken, web kapsayıcısı bu sınıfları sağladığı için Servlet API'sına ve ilgili Java EE API'lerine bağımlılığı sağlanan kapsama ayarlayacaksınız. Bu kapsam yalnızca derleme ve test sınıfyolunda kullanılabilir ve geçişli değildir.

Recap:

  • bağımlılıklar geçişli değildir (belirttiğiniz gibi)
  • sağlanan kapsam yalnızca derleme ve test sınıfyolunda kullanılabilirken, derleme kapsamı tüm sınıfyollarında kullanılabilir.
  • sağlanan bağımlılıklar paketlenmez

5
Evet biliyorum. Ama kapsamlardaki farkın JAR packagingbağlamını düşünmekteyim . Maven doc bundan bahsetmiyor. Maven'i bir süre kullanıyorum, ama kendime zaten sordum :) Yani JAR packagingbağlamda compileve provided(bağımlılık geçişi hariç) arasında herhangi bir fark yok gibi görünüyor . Haklı mıyım?
emstol

3
@Jacob "derleme kapsamı tüm sınıf yollarında kullanılabilirken" ile kastedilmektedir ?
Geek

1
Bence "Geçişli DEĞİL" burada büyük yakalamak olduğunu. Çünkü bağımlılık cehennemi, geliştiricilerin çok sık karşılaştığı bir şeydir ve Sağlanan kapsam, onun devam etmesini önler ve diğer sürümlerle uğraşmak çok önemlidir.
Seetharamani TM

2
Bence fark paketleme aşamasında. Derleme ile, kavanozu son savaşta veya kavanozda (yay önyükleme yürütülebilir kavanoz gibi) içerecek ve sonuçlanmayabilir. Sağlanan kavanoz web kapsayıcısı (ext lib klasörüne koymak gibi) tarafından sağlandığından, diğer kapsamlara, derlemeye, çalışma süresine bağlı değilse savaş paketinde değildir.
Addo Zhang

1
@emstol Orijinal sorunuza geri dönersek, JAR durumunda bağımlılıkların JAR'ın içinde paketlenmediği konusunda haklısınız. Ancak maven'de, bir JAR ambalajı, bunun kütüphane olarak kullanılmasını istediğiniz anlamına gelir. Diğer bazı maven projelerinde içeri aktarır compilealmaz , kapsam olduğu takdirde geçişli bağımlılıklar getirilecek ve kapsam ise olmayacaktır provided.
LeoLuz

291

Derleme, uygulamayı derlemek ve çalıştırmak için JAR'a ihtiyacınız olduğu anlamına gelir. Bir web uygulaması için, örnek olarak, JAR WEB-INF / lib dizinine yerleştirilecektir.

Sağlanan, derlemek için JAR'a ihtiyacınız olduğu anlamına gelir, ancak çalışma zamanında ortam tarafından sağlanan bir JAR vardır, böylece uygulamanızla paketlenmesine gerek yoktur. Bir web uygulaması için bu, JAR dosyasının WEB-INF / lib dizinine yerleştirilmeyeceği anlamına gelir.

Bir web uygulaması için, uygulama sunucusu zaten JAR'yi (veya işlevselliğini) sağlıyorsa, "sağlanan" seçeneğini kullanın; aksi takdirde "derle" seçeneğini kullanın.

İşte referans.


11
OP'nin sorusuna cevap vermiyor musunuz? ' Maven kapsam derlemesini kullanmanın farkı nedir ve yapı JAR olarak oluşturulduğunda sağlanır ? “Yazarın savaş olarak ambalajlarken farkı bildiklerini açıkça belirttiğine dikkat edin.
Alberto

aynı uygulama sunucusunda konuşlanmış başka bir JAR başvuruyorsanız sağlanan kullanabilir miyim?
Samy Omar

1
Açık olmak gerekirse mvn exec:java, çalıştırıldığında sınıfyoluna sağlanan bir bağımlılık eklenmez , ancak derlenmiş bir bağımlılık olur.
Jamie

Bu soruyu sordum - stackoverflow.com/questions/37360132/… Sorun derleme sağlamak için sağlanan kapsamı değiştirerek çözüldü. Ancak "sağlanan" kapsamla derlenmiş kavanoz ile "derleme" kapsamıyla derlenmiş kavanoz arasında herhangi bir fark görmüyorum. Nedenini açıklayabilir misiniz?
Pavel_K


22

Tüm bağımlılıklarıyla (tipik xxxx-all.jar) tek bir JAR dosyası oluşturmayı planlıyorsanız, bu kapsam içindeki sınıflar sonuçta ortaya çıkan JAR'da paket olmayacağı için kapsam önemlidir.

Daha fazla bilgi için maven-assembly-eklentisine bakınız


7
sağlanan bağımlılık ==> bağımlılık olacak DEĞİL paketlenecek.
Gab 是 好人

3
OP karışıklığı, paketlendiğinde açıkça çözülür maven-assembly-plugin, en çok oy alan cevapların bundan bahsetmemesi ilginçtir.
Henrique G. Abreu

Bu cevabı anlamıyorum. Daha çok bir yorum gibi görünüyor.
reinierpost

11
  • derleme

Sınıf yolunda kullanılabilir yapın, normal kavanoz ise bu bağımlılığı son kavanoza eklemeyin; ancak son kavanoz tek bir kavanoz ise (örneğin yürütülebilir kavanoz) bu kavanozu kavanoza ekleyin

  • sağlanan

Bağımlılık, çalışma zamanı ortamında kullanılabilir olacaktır, bu nedenle bu bağımlılığı hiçbir durumda eklemeyin; tek kavanozda bile (örneğin yürütülebilir kavanoz vb.)


3

Bir jar dosyası için, addClassPath, maven-jar-eklenti yapılandırmasında true değerine ayarlanırsa, kavanoza dahil edilen MANIFEST.MF dosyasında listelenen sınıfyolundaki farktır. 'derleme' bağımlılıkları manifest'te görünür, 'sağlanan' bağımlılıklar görünmez.

Evcil hayvanımdan biri, bu iki kelimenin aynı zamana sahip olması gerektiğidir. Derlenmiş ve sağlanmış veya derlenmiş ve sağlanmış.


0

Maven kapsamını olarak ayarladığınızda provided, eklenti çalıştığında, kullanılan gerçek bağımlılıklar sürümü yüklediğiniz Apache Maven sürümüne bağlı olacaktır.


0

Jar dosyası çalıştırılabilir yay önyükleme jar dosyası gibi ise, tüm bağımlılıkların kapsamı compiletüm jar dosyalarını içermelidir .

Ancak, diğer paketler veya uygulamalarda kullanılan jar dosyası varsa, bu paketler veya uygulamalar başka bağımlılıklar da sağlayabildiğinden, jar dosyasındaki tüm bağımlılıkları içermesi gerekmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.