Maven'in dağıtım yönetimi organizasyonu genelinde nasıl belirlenir?


110

Birçok (yaklaşık 50'den fazla) maven2 projesini merkezi bir bağlantı noktası havuzuna yerleştirebilmeleri için nasıl organize edeceğimi anlamaya çalışıyorum. mvn deployHedef kullanılırken, hedefin dağıtım Yönetimi etiketinde şu şekilde belirtilmesi gerekir:

<distributionManagement>
   <repository>
      <id>nexus-site</id>
        <url>http://central_nexus/server</url>
   </repository>
</distributionManagement>

Şimdi, her bir pom.xml'nin (50'den fazla olanın) bu bloğu tekrar tekrar içermesini istemiyorum. İlk düşüncem settings.xmldosya olurdu , ama öyle görünüyor ki onu orada tanımlamak (tasarım gereği) mümkün değil. Öyleyse, ilk soru, neden böyle? Mümkünse, tüm geliştiricilere dağıtılabilen maven2 dağıtımındaki settings.xml içinde belirtebilirim.

Bulduğum tek olası çözüm, bu ayarları içeren kuruluş çapında bir master-pom projesi oluşturmak ve diğer tüm pom.xml'leri bu master-pom'a bağlı kılmaktı. <parent> etiket . Ancak bu, çok modüllü yapılarda biraz garip görünüyor:

- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
    - Project 1 module pom (with pm as parent)
    - Project 2 module pom (with pm as parent)

Genellikle tüm belgelerde, modül pomlarının farklı olanı değil, ana pomu kullanması gerektiğini okurum. Ancak Inheritance v. Aggregation hakkındaki maven web sitesini okuduktan sonra bunun gerçekten mümkün olduğu yazılmıştır.

Bulduğum bir sorun, bu kurulumla ilgili sorunları var gibi görünen maven site oluşturma ile ilgiliydi (modüller, doğrudan geri referansları yoksa doğru şekilde bağlanmazlar)

Peki bu geçerli bir yaklaşım mı? Soruna başka, daha açık, daha basit bir çözüm var mı?



5
@OhadR: Sadece bir projede nasıl yazılacağını yazıyorlar. Demek istediğim, onu yaklaşık 500 kez çoğaltmak istemedim ...
mglauche

1
anlıyorum. nokta alınmıştır. böylece cevaplayanın söylediği gibi, proje için 'distribMngmnt' içerecek bir ana pomunuz olabilir ...
OhadR

Yanıtlar:


144

Bunun için en iyi çözüm, kuruluşunuzdaki tüm projeler için genel olarak basit bir ana pom dosyası projesi ('pom' ambalajlı) oluşturmaktır.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>your.company</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <distributionManagement>
        <repository>
            <id>nexus-site</id>
            <url>http://central_nexus/server</url>
        </repository>
    </distributionManagement>

</project>

Bu, herkesin yapısına erişebilmesi için yerel bağlantı noktanıza inşa edilebilir, serbest bırakılabilir ve dağıtılabilir.

Şimdi, kullanmak istediğiniz tüm projeler için bu bölümü eklemeniz yeterlidir:

<parent>
  <groupId>your.company</groupId>
  <artifactId>company-parent</artifactId>
  <version>1.0.0</version>
</parent>

Bu çözüm, şirketinizin tüm projelerine kolayca başka ortak şeyler eklemenizi sağlayacaktır. Örneğin, JUnit kullanımınızı belirli bir sürüme standart hale getirmek istiyorsanız, burası bunun için mükemmel bir yer olacaktır.

Kendi üst öğesi olan çok modüllü yapıları kullanan projeleriniz varsa, Maven ayrıca zincirleme mirasını da destekler, böylece projenizin ana pom dosyasının şirketinizin ana pom'una atıfta bulunması ve projenin alt modüllerinin sizden haberdar olmaması tamamen kabul edilebilir. şirketin ebeveyni.

Örnek proje yapınızdan ana projenizi toplayıcı pononuzla aynı seviyeye koymaya çalıştığınızı görüyorum. Projenizin kendi ana birimine ihtiyacı varsa, bulduğum en iyi yaklaşım, ana birimi diğer modüllerle aynı seviyeye dahil etmek ve tüm modüllerinizin dizinlerinin bulunduğu kökte toplayıcı pom.xml dosyanızı bulundurmaktır.

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2

Bu yapıyla yaptığınız şey, üst modülünüzü toplayıcıya dahil etmek ve her şeyi mvn installkök dizinden a ile oluşturmaktır .

Bu kesin çözümü kuruluşumda kullanıyoruz ve zamanın testinden geçti ve bizim için oldukça iyi çalıştı.


İşte proje mirasını daha ayrıntılı olarak açıkladığım ve miras karmaşıklığını nasıl yöneteceğimi anlattığım başka bir cevap, kelime oyununu affedin. ;) stackoverflow.com/questions/6347913
Jesse Webb

7
Küçük bir not: şirketin ana kuruluşunun en iyi çözüm olmasının nedenleri için , Maven kullanıcı listesinden settings.xml'de dağıtım Yönetimi belirtemiyorum tartışmasına bakın .
Premek Brada

"Kodun müşteriye ait olduğu" klasik danışmanlık modelinde, geliştirme ekibimin proje üzerinde site dışında çalışması ve ardından en son kodu müşteri sitesine götürmesi ve yeniden oluşturması gerekecektir. Benim durumumda, çok modüllü bir projeyle çalışırken, proje ana POM'unda şirket POM'una referans verirsem, bu referansı müşterinin şirketinin POM'una işaret edecek şekilde güncellemem gerekecek. Yardımcı olabilirsem, settings.xml'deki tüm ortama özgü ayarları korumayı tercih ederim. Durumum için önerilen yaklaşım nedir?
Web Kullanıcısı

2
@WebUser Probleminiz, bu cevabın adreslerinden farklı olarak POM dosyalarınızda farklı değerlere ihtiyaç duyduğunuz bir duruma benziyor: birden fazla modülde yinelenen ayarlardan kaçınmak. Bence bir settings.xml dosyası aracılığıyla özellikleri enjekte etmeyi denemelisiniz . Bu size yardımcı olmazsa, SO'da yeni bir soru sorun, buraya bağlantı verin, size daha fazla yardımcı olmaya çalışacağım.
Jesse Webb

Teşekkürler @JesseWebb Sonunda bunu denedim ve bu değerleri anlattığım durum için POM'dan soyutlamak faydalı. İhtiyaçlarım için, aktif profilin altına ve POM'da çözülen özellikleri ekledim.
Web Kullanıcısı

36

Bir ebeveyn POM'una gerek yoktur.

DistributionManagement bölümünü tamamen pom'larınızda çıkarabilir ve bunu yapı sunucunuzda veya settings.xml'de ayarlayabilirsiniz.

Bunu yapı sunucusunda yapmak için mvnkomuta geçmeniz yeterlidir:

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

Hangi seçeneklerin ayarlanabileceğiyle ilgili ayrıntılar için https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html adresine bakın .

Bunu kendi settings.xml.

Orada etkin olan ve mülkü içeren bir profil oluşturun.

Örnek settings.xml:

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

"Anlık görüntüler" ve "sürümler" için kimlik bilgilerinin <servers> settings.xml dosyanızın bölümünde bulunduğundan emin olun.

AltSnapshotDeploymentRepository ve altReleaseDeploymentRepository özellikleri, maven-deploy-plugin 2.8 sürümü ile tanıtıldı. Daha eski sürümler hata mesajıyla başarısız olur

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

Bunu düzeltmek için, eklentinin daha yeni bir sürümünü uygulayabilirsiniz:

        <build>
          <pluginManagement>
            <plugins>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>

Bu çözümü sürekli deniyorum ama sadece altDeploymentRepository özelliği çalışıyor. altReleaseDeploymentRepository ve altSnapshotDeploymentRepository tanınmıyor ve şu hatayı alıyorum: Dağıtım başarısız oldu: Depo öğesi, DistributionManagement öğesi veya -DaltDeploymentRepository = id :: layout :: url parametresi içindeki POM'da belirtilmedi. Herhangi bir öneri yardımcı olacaktır. Teşekkürler
Shabirmean

@Shabirmean Nedeni, dağıtım eklentisinin çok eski bir sürümü. Cevabımı bir çözümle genişlettim.
Michael Wyraz

Evet, anladım. Çok teşekkür ederim :)
Shabirmean
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.