Pom xml'deki bağımlılık ve eklenti etiketleri arasındaki maven farkı nedir?


118

Maven aracında yeniyim, Spring ve Hibernate ile bir proje yaptım ve pom.xml'de eklenti olarak yapılandırıldı, ancak JUnit bağımlılık altında etiketlendi. Sorum şu, birinin bir eklenti ve diğerinin bağımlılık olarak arkasındaki mantık nedir?

Yanıtlar:


213

Hem eklentiler hem de bağımlılıklar Jar dosyalarıdır.

Ancak aralarındaki fark, maven'deki işin çoğunun eklentiler kullanılarak yapılmasıdır; oysa bağımlılık, görevleri yürütürken sınıf yoluna eklenecek bir Jar dosyasıdır.

Örneğin, java dosyalarını derlemek için bir derleyici eklentisi kullanırsınız. Derleyici eklentisini bir bağımlılık olarak kullanamazsınız çünkü bu sadece eklentiyi sınıf yoluna ekler ve herhangi bir derlemeyi tetiklemez. Dosyayı derlerken sınıf yoluna eklenecek Jar dosyaları, bağımlılık olarak belirtilecektir.

Aynı senaryonuz için de geçerli. Bazı yay çalıştırılabilir dosyalarını çalıştırmak için yay eklentisi kullanmanız gerekir [yay eklentilerinin ne için kullanıldığından emin değilim. Burada sadece bir tahmin yapıyorum]. Ancak bu yürütülebilir dosyaları yürütmek için bağımlılıklara ihtiyacınız var. Ve Junit, birim testlerini yürütmek için surefire-eklentisi tarafından kullanıldığından bağımlılık altında etiketlenir.

Bu nedenle, eklentinin görevi yürüten bir Jar dosyası olduğunu ve bağımlılığın, görevi yürütmek için sınıf dosyalarını sağlayan bir Jar olduğunu söyleyebiliriz.

Umarım sorunuzu yanıtlar!


Biri bana uygulamada aşama ve hedef arasındaki farkın ne olduğunu söyleyebilir miyim? Bildiğim gibi, aşama maven'in yaşam döngüsünden bahsediyor .. ama neden tekrar hedef? herhangi bir ipucu? Bazen insanların yaşam döngüsü anahtar kelimesini hedefe koyduğunu görüyorum ... ??? (?.?)
taymedee

@taymedee bu SO sorusu farkı açıklıyor: stackoverflow.com/questions/16205778/…
dev_feed

1
@ r981 Cevabınızın daha net olması gerekiyor. Bu cevap daha iyi: stackoverflow.com/questions/26292073/…
Digital Impermanence

Sanırım bu cevabın kaçırılan noktası şudur: üst düzey bağımlılıklar, eklentiler yerine esas olarak yapınız tarafından kullanılır.
2016

3
@MichaelP Pacheco, Demek istediğim, spring-plugin, 'bağımlılıklar' ile belirlenecek bazı kitaplıklara bağlı olabilecek bir dizi kodu yürütme görevini yerine getirecek. Farklı bir örnek alın: bir kod parçasını yürütmek için bir derleyiciye ihtiyacınız var; Burada, derleyiciniz bir eklentidir ve kodunuz çalıştırılabilirdir. Derleyiciniz tek başına herhangi bir kodu çalıştırabilir, ancak kodunuz bir kitaplığa bağımlı olabilir, örneğin apache commons, bu bir bağımlılık olacaktır. Derleyiciniz kodu yalnızca sınıf yolunda bağımlılıklar mevcut olduğunda derleyebilir. Umarım artık açıktır.
r9891

37

Maven'in kendisi, farklı görevleri yerine getirmek için kullanılabilecek birçok farklı birimi olan mutfak robotu olarak tanımlanabilir. Bu birimlere eklenti denir. Örneğin, projenizi derlemek için maven kullanır maven-compiler-plugin, testleri çalıştırır maven-surefire-pluginve benzeri.

Maven açısından bağımlılık, projenizin bağlı olduğu paketlenmiş bir sınıf parçasıdır. Jar, war vb. Olabilir. Örneğin, JUnit testi yazabilmek istiyorsanız, JUnit açıklamalarını ve sınıflarını kullanmanız gerekir, bu nedenle projenizin JUnit'e bağlı olduğunu bildirmeniz gerekir.


hızlı yanıt için teşekkürler, üzgünüm ama yine de kafam karıştı, çünkü JUnit'in de bir çerçeve olduğunu ve (hazırda bekletme, yay) da yalnızca çerçeve kapsamında geliyor, yani durumlarda (hazırda bekletme, yay) bağımlılık etiketlerinde de yapılandırılabilir. ? umarım sorumu almışsındır.
Mercan

Evet ve bildiğim kadarıyla Spring maven eklentisi diye bir şey yok. Genellikle, Spring kütüphaneleri (veya Hibernate veya JUnit veya TestNG vb.) Projeniz için bağımlılıklar olarak ilan edilir. Yeni doğmuş biriyseniz, bu çok güzel kitabı okumanızı tavsiye ederim .
Andrew Logvinov

@AndrewLogvinov - API otomasyon testi için bir multi pom projem var. Maven projelerinden birinin otomasyon testleri var. Proje pom'un derleme bölümünde yalnızca 1 eklenti vardı - bir pakete referansla maven surefire eklentisi. Tüm yapı etiketi kaldırıldı. Lütfen bana bunun ne anlama geldiğini söyler misin? Teşekkürler.
MasterJoe

15

Eklentiler ve bağımlılıklar çok farklı şeylerdir ve bunlar tamamlayıcıdır.

Hangi eklentiler?

Eklentiler, bir Maven derlemesi için görevler gerçekleştirir. Bunlar uygulamada paketlenmemiştir.

Bunlar Maven'in kalbidir.
Maven tarafından yürütülen herhangi bir görev eklentiler tarafından gerçekleştirilir .
: İki eklentileri kategorisi vardır ve eklentileri :buildreporting

  • Derleme eklentileri, derleme sırasında çalıştırılacak <build/>ve POM'dan öğede yapılandırılmalıdır .
  • Raporlama eklentileri site oluşturma sırasında çalıştırılacak <reporting/ve POM'daki> öğesinde yapılandırılmalıdır .

Komut satırında belirtilen maven hedefine göre (örneğin mvn clean, mvn clean packageveya mvn site), belirli bir yaşam tarzı kullanılacak ve belirli bir dizi eklenti hedefi yürütülecektir.
Orada yerleşik yapı yaşam çevrimleri üç şunlardır: default, cleanve site. Yaşam defaultdöngüsü proje dağıtımınızı, cleanyaşam döngüsü proje temizliğini gerçekleştirirken siteyaşam döngüsü de projenizin site belgelerinin oluşturulmasını yönetir.

Bir eklenti hedefi, belirli bir yaşam süresinin belirli bir aşamasına bağlı olabilir.
Örneğin maven-compiler-plugin, varsayılan olarak bağlandığı compileyaşam döngüsü fazına hedef: compile.
Maven eklentilerinin çoğu (hem temel eklentiler hem de üçüncü taraf eklentiler), yapılandırmaya göre kuralları tercih eder. Bu nedenle bunlar, kullanımlarını daha basit hale getirmek için genellikle bir eklenti hedefini belirli bir aşamaya bağlar.

Bu daha temiz ve daha az hataya meyillidir:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
</plugin>

şundan:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
  <executions>
    <execution>
        <phase>compile</phase>
        <goals>
            <goal>compile</goal>
        </goals>
    </execution>
  </executions>
</plugin>

Bağımlılıklar nelerdir?

Bağımlılıklar, Maven derlemesi sırasında sınıf yolunda gerekli olan Maven yapıları / bileşenleridir.
Bunlar uygulamada paketlenmiş olabilir, ancak zorunlu değildir (aşağıya scopebakın).

Bağımlılıkların çoğu jar ancak bunlar başka türden arşivler de olabilir: savaş, kulak, test kavanozu, ejb-müşteri ... veya yine de POM veya BOM.
Bir pom.xml'de, bağımlılıklar birden çok yerde belirtilebilir: bir bildirimde<build><dependencies> parça, dependencies managementparça veya hareketsizlik ! Aslında bazı eklentilerin yürütülürken sınıf yolunda bazı bağımlılıklara sahip olması gerekebilir. Bu yaygın değildir ama bu olabilir. İşte bunu gösteren ve birlikte çalışabilecek belgelerden bir örnek : plugin
plugindependency

Örneğin, Maven Antrun Plugin sürüm 1.2 Ant sürüm 1.6.5'i kullanıyor, bu eklentiyi çalıştırırken en son Ant sürümünü kullanmak istiyorsanız <dependencies>, aşağıdaki gibi öğeler eklemeniz gerekir :

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.2</version>
        ...
        <dependencies>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.1</version>
          </dependency>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-launcher</artifactId>
            <version>1.7.1</version>
          </dependency>
         </dependencies>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Maven olarak, bağımlılıkları belirli bir biçimde başvurulan:
groupId:artifactId:packaging:classifier:version.
Sınıflandırıcı (bu isteğe bağlıdır) ve paketleme ( JARvarsayılan olarak) yaygın olarak belirtilmemiştir. Yani ortak biçim dependencybildiriminde oldukça geçerli: groupId:artifactId:version.
İşte <build><dependencies>bölümde açıklanan bir bağımlılık örneği :

<build>
   <dependencies>
      <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>5.2.14.Final</version>
      </dependency>
   <dependencies>
</build>

Bir eklentinin aksine, bağımlılığın bir kapsamı vardır.
Varsayılan kapsam compile. Bu, en sık ihtiyaç duyulan kapsamdır (yeniden yapılandırma yerine kongre). Kapsam bağımlılık bir projenin tüm Sınıf yollarıyla mevcut olduğu anlamına gelir.
compile

Kapsam, bağımlılığın hangi sınıf yollarına eklenmesi gerektiğini tanımlar. Örneğin, buna derleme ve çalışma zamanında mı yoksa yalnızca testlerin derlenmesi ve çalıştırılması için mi ihtiyacımız var?

Örneğin daha önce bir şekilde Hibernate tanımlanan compileher yerde ihtiyaç olarak bağımlılık: öylesine için kaynak derleme test derleme, çalışma zamanını ve ....
Ama biz o test kütüphaneleri uygulamasında paketlenmiş veya kaynak kodunda başvurulan olabilir istemiyoruz . Bu yüzden onlar için testkapsamı belirliyoruz:

<build>
   <dependencies>
     <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
     </dependency>
   <dependencies>
</build>

Harika bir açıklama !, Java'da bağımlılıklar kurma konusunda çok bilgili olmadığım için hala bir şüphem var, şu anda IntelliJ'de çalışıyorum ve webdriver-ieiki seçeneğim var ya da dahil etmeye çalıştığımda bir maven projesi oluşturdum . pluginsveya dependency, karşılaştırmak için her ikisini de dahil ettim ve her ikisinin de tamamen aynı olduğunu gözlemledim groupId, tek fark, pluginsbelirli bir sürümle dependencygelmemesi ve birlikte gelmesiydi 0.6.685. Bunu meslekten olmayan kişilerle (bu örnekle ilgili olarak) farkın ne olduğunu, hangisinin ne zaman kullanılacağını açıklayabilir misiniz? Herhangi bir öneri?
Anu

1
Kendinizi görmeden en kesin cevabı vermek zor pom.xml. Ancak ilginizi çekmesi gereken bir şey, Maven 3'ten bu yana (muhtemelen özellik olarak kötü bir fikir) herhangi bir Maven sürümünde bağımlılık sürümünün (mevcut pomda veya kalıtsal bir bağımlılık ise ana pomda) zorunlu olduğudur. eklenti sürümünün belirtilmesi isteğe bağlıdır. Maven, Maven'ın bulduğu sürüm deposunda bulunan son sürümü kullanacaktır. (1/2)
davidxxx

1
Bir eklenti belirlemenin kötü bir yolu olduğunu unutmayın. Yapınızı zaman içinde tekrarlanabilir yapmaz ( cwiki.apache.org/confluence/display/MAVEN/… ). Yapıda bir uyarı görmelisiniz. Öyleyse "fark nedir?" Eklentiler bir Maven derlemesi için görevler gerçekleştirirken, bağımlılık derleme sırasında sınıf yolunda ihtiyaç duyulan kitaplıklardır (jar veya her neyse). Projenizin yapısı ne olursa olsun aynıysa (kitaplık veya eklenti yolu kullanılarak), eklentinin kullanılmadığı için çaresiz olduğu anlamına gelir. (2/2)
davidxxx

6

Benim gibi bir front-end geçmişinden geliyorsan ve Grunt ve npm'ye aşinaysan, bunu şöyle düşün:

Önce koşarsın, diyeceksin npm install grunt-contrib-copy --save-dev. Bu Maven'inki gibi <dependency></dependency>. Bir yapı görevini yürütmek için gereken dosyaları indirir.

Ardından görevi Gruntfile.js'de yapılandırırsınız.

copy: {
  main: {
    src: 'src/*',
    dest: 'dest/',
  },
}

Bu Maven'inki gibi <plugin>/<plugin>. Derleme aracına npm / tarafından indirilen kodla ne yapacağını söylüyorsunuz <dependency></dependency>.

Elbette bu tam bir benzetme değil, ancak kafanızı etrafına dolamanıza yardımcı olacak kadar yakın.


4

Eklentiler, kendilerine işlevler eklemek için kullanılır Maven( eclipsedestek veya SpringBootdestek eklemek Mavengibi). Bağımlılıklar, herhangi bir Maven aşamasını ( compileveya testörneğin) geçmek için kaynak kodunuz tarafından gereklidir . Durumunda JUnittest kodu temelde kod tabanının parçasıdır ve çağrı beri JUnittestlerinden içindeki belirli komutları ve o komutlar tarafından sağlanmayan Java SDKnedenle JUnitanda mevcut olması gerekir Maventest aşamasında olup bu bahsederek ele alınır JUnitbir bağımlılık olarak sizin de pom.xmldosyaya.


1

Maven, temelindeki bir eklenti yürütme çerçevesidir - resmi ve standart kompakt tanımlara göre. Daha açık hale getirmek için maven-install/clean/compile/build etc, bazen manuel olarak da çalıştırdığımız kavanozları oluşturmak / yürütmek için kullandığınız komutlar . Bu nedenle, çalıştırmak (veya yapılandırmak veya yürütmek) istediğiniz şeyler temelde onları mavens pom bağımlılık etiketine koyarsınız ve bu bağımlılıkları kimin çalıştıracağı (ortam kurulumu için gerekli) eklentilerdir.

        javac (compiler) dependency.java (dependency) 

1

Tek satır cevap - temel anlayış

Eklenti , maven yapınızın yürütülmesinde kullandığınız bir araçtır

Bağımlılık , kodunuzda kullanacağınız herhangi bir kitaplık anlamına gelir


0

Eklenti, eserinizi üretmek için kullanılan Maven'in bir uzantısıdır (bir örnek için maven-jar-eklentisi, derlenmiş sınıflarınızdan ve kaynaklarınızdan bir kavanoz yapmak için kullanılır, tahmin edersiniz).

Bağımlılık, derleme ve / veya test ve / veya çalışma zamanında oluşturduğunuz uygulama tarafından ihtiyaç duyulan bir kitaplıktır.

eklenti ve bağımlılık

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.