Bir modülü Maven reaktör yapısından nasıl hariç tutabilirim?


98

İçinde çok sayıda modül bulunan bir Maven 2 projemiz var. Misal:

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>

Diyelim ki "veri" modülünün oluşturulması zaman alıyor ve proje bir CI sunucusu tarafından oluşturulduğunda onu dışlamak istiyoruz. Şu anda bunu başarmak için iki pom.xml dosyası kullanıyoruz. Birinde tüm modüller var ve diğerinde CI için bırakılabilenler hariç tüm modüller var. Ama bu oldukça can sıkıcı çünkü bazen her iki dosyaya da yeni bir modül koymayı unutuyoruz .

İki ayrı modül listesine ihtiyaç duymayan bir çözüm var mı?

Yanıtlar:


73

En kolayı şu şekilde kullanmak olabilir profiles:

<project>
  ...
  <modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  <modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

Daha sonra profilleri etkinleştirebileceğiniz yolları kontrol etmelisiniz


Verilerin ortak olandan önce gerçekleşmesine ihtiyacınız varsa ne yapardınız? Bu durumda profil modülleri, reaktör sırasına göre varsayılan modüllerden sonra yerleştirilecektir. Düzeni zorlamak için bir model var mı?
Peter Kahn

9
Modülün sırası, reaktörde görünecekleri sıra DEĞİLDİR. Sırayı etkilemenin tek yolu modüller arasında bağımlılıklar yaratmaktır, yani <dependency> etiketini kullanarak. Bunun için beyan emrine güvenemezsiniz.
SaM

7
@SaM Aslında, bağımlılıklar tarafından dikte edilen sıra daha yüksek bir önceliğe sahip olsa da, Maven 3.0.5'ten itibaren Reaktör 'modüllerdeki' sırayı dikkate alacaktır .
hellodanylo

Bu, profil etkin olsa bile profildeki modülü tespit edemeyen diğer bazı eklentileri
bozacaktır

143

Maven 3.2.1 ile, artık -pl !<module_name>,!<module_name>belirli modülleri reaktör yapısının dışında bırakmak için kullanabilirsiniz .

Bu özellik isteğine bakın: https://issues.apache.org/jira/browse/MNG-5230


3.0.4'ten 3.2.1'e geçmek güvenli mi yoksa daha büyük değişiklikler var mı?
Ocak

Herhangi bir sorun olmadan 3.1'den 3.2.1'e geçtim. Ama dürüst olmak gerekirse, anlamak için bir yapı yapmanız gerekir.
Yogesh_D

30
Kabuk komut satırındaki ünlem işaretinden kaçmayı unutmayın. Bunun çok özel bir anlamı vardır, örneğin bkz. Unix.stackexchange.com/questions/3747/…
Pavel

5
Maalesef şu anda Jenkins maven-project eklentisinde reaktör modül dışlamasını desteklemeyen açık bir sorun var: issues.jenkins-ci.org/browse/JENKINS-26472
Nick Vanderhoven

@Pavel: veya -yerine kullanın !, yani-pl -<module_name>
msa

45

Oluşturulacak projeler mvn komut satırında da belirtilebilir. Bu, ayrı bir pom ihtiyacını ortadan kaldırır, ancak bunun yerine her yeni modül olduğunda CI yapılandırmasını değiştirmeniz gerekir.

-pl,--projects <arg>                Comma-delimited list of specified
                                    reactor projects to build instead
                                    of all projects. A project can be
                                    specified by [groupId]:artifactId
                                    or by its relative path.

Belki bu bayrağın bir kombinasyonu ve --also-make-dependentsveya --also-makebu bakım yükünü yeniden azaltabilir.

-am,--also-make                     If project list is specified, also
                                    build projects required by the
                                    list
-amd,--also-make-dependents         If project list is specified, also
                                    build projects that depend on
                                    projects on the list

Bu, iki ayrı pom kullanmakla aynı sorunlara sahiptir. Modülleri tanımladığımız yerlere koymalıyız. Kaçınmaya çalıştığım şey bu.
kayahr

Bu iyi bir çözüm. Pom'ı güncellemenize gerek yok. mvn clean install -pl mysubproject
nicolas-f

22

Varsayılan yapının hızdan bağımsız olarak her şeyi her zaman inşa etmesini istediğinizi varsayıyorum, böylece yeni geliştiriciler POM hakkında çok şey anlamak zorunda kalmadan hızlı bir şekilde başlayabilirler. Bunun gibi profilleri kullanabilirsiniz:

<modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  </modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

Bununla ilgili sorun, bir geliştiricinin komut satırında başka bir profil belirlemesi durumunda bu profilin expensive-modules-to-builddahil edilmemesidir (geliştirici de belirtmedikçe). Bu, hangi profillerin dahil edilmesi gerektiğini hatırlamayı karmaşık hale getirir.

İşte bunun etrafından dolaşan bir yol. Her iki profil de dahil edilir çünkü pom.xml dosyası her zaman mevcuttur. Bu yüzden pahalı modülleri dışlamak -P!full-buildiçin komut satırında kullanabilirsiniz.

<profiles>
    <profile>
        <id>full-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
            <module>data</module>
        </modules>
    </profile>
    <profile>
        <id>short-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
           <module>common</module>
           <module>foo</module>
           <module>bar</module>
        </modules>
    </profile>
</profiles>

Güzel cevap. Ancak 2. kod örneğinde gerçekten iki profile ihtiyacınız var mı? 1. kod örneğindeki değiştirilmiş bir aktivasyon elemanına sahip tek profil çalışmaz mı?
Arend - Reinersdorff

@ Arendv.Reinersdorff evet olur, ancak bu yanıt, varsayılan olarak dahil etmek isteyebileceğiniz yapıdaki diğer profillerle de çalışır. Genel olarak yine de, diğer cevabın -pl !<module_name>,!<module_name>bu eski
cevaptan

1
İyi bir aktivasyon numarası. Her zaman etkin olmayan <activeByDefault> ile ilgili sorunları çözdü!
Gab

7

Başka bir fikir: Reaktör modülleri yuvalanabilir, bu nedenle hızlı ve yavaş inşa edilen modüllerinizi ayrı pomlar halinde gruplamak ve ardından bu ikisini modül olarak içeren başka bir toplayıcı pom eklemek mümkün olmalıdır. CI Sunucunuz daha sonra yalnızca hızlı yapı modüllerini içeren pomu referans alabilir.

<artifactId>fast</artifactId>
<modules>
    <module>fast-a</module>
    <module>fast-b</module>
    <module>fast-c</module>
</module>

<artifactId>all</artifactId>
<modules>
    <module>fast</module>
    <module>slow</module>
</module>

1

Maven profillerini kullanabilirsiniz . Derleme ortamımızda, quickbirçok eklentiyi ve test yürütmeyi devre dışı bırakan bir profil oluşturduk .

Bunu yapan

    <profile>
        <id>quick</id>
        <properties>
            <skipTests>true</skipTests>
            <!-- others... -->
        </properties>   
        <build>
            <plugins>
                 <!-- configuration... -->
            </plugins>
        </build>
    </profile>

Ve sonra maven'i şu şekilde çağırıyoruz

mvn groupId:artifactId:goal -P quick

Hızlandırmak için modülünüzün pom'unda derlemeyi ve diğer standart eklentileri devre dışı bırakabilirsiniz.


2
Evet, testleri devre dışı bırakmak için bu harika çalışıyor. Ancak pomda iki ayrı modül listesi OLMADAN modülleri dışlamak için profilleri nasıl kullanabilirim? Bildiğim kadarıyla tam modül listesini bir profil bölümüne ve hızlı oluşturma modülü listesini başka bir profil bölümüne koymam gerekiyor. Yani bu, iki ayrı pom kullanmakla aynı soruna sahip: Korumam gereken iki modül listem var.
kayahr

Modülleri dışlamak gerçekten maven'de bir şeyler yapmanın bir yolu değil ve benim maven ile olan deneyimim, işlerin nasıl yapıldığına bağlı kalmak için daha iyi, yoksa çok fazla problemle karşılaşıyorsun ... Yani gerçekten önerdiğim şey değil modülü çıkarın, ancak bu modülü daha az zaman alıcı hale getirmek için.
Nr9

Maven ile ilgili sorun, 'işlerin yapılma biçiminin' çoğu zaman 'gerçek dünyada işlerin yapıldığı yöntemle' uyumlu olmaması ve bu da maven deneyimini zayıf ve acı verici hale getirmesidir. Geliştiriciler bir doz UX eğitimi alsa iyi olur.
Ed Randall

0

Bu insanın sorduğu cevap tam olarak bu değil. Benim durumum sadece ebeveyn pom'unu yerleştirmek istememdi. Ben kullanıyorum spring-boot-thin-layoutbir çocuk modülünde. Bu, üst modülün yapay olarak konuşlandırılmasını gerektirir. Aşağıdakileri projeme ekledim. Aşamanın installve / veya deployaşamaların atlanmasını sağlar .

Benim ebeveyn pomumda:

<properties>
    <disable.install>true</disable.install>
    <disable.deploy>true</disable.deploy>
    <enable.deployAtEnd>true</enable.deployAtEnd>
</properties>

<profiles>
    <profile>
        <id>deploy-parent</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <disable.install>true</disable.install>
            <disable.deploy>true</disable.deploy>
            <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
        </properties>
        <build>
            <finalName>${project.version}</finalName>
        </build>
    </profile>
</profiles>

Ve benim çocuğumda veya ebeveyn ile konuşlandırılmasını istemediğiniz herhangi bir modülde:

<properties>
    <maven.install.skip>${disable.install}</maven.install.skip>
    <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
    <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>

Öyle etkili bir şekilde mvn deployüst pom üzerinde çalıştırdığımda , tüm modülleri derleyecek, hiçbir şey üzerinde yüklemeyi çalıştırmayacak ve sonunda <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>özelliklerinde olmayan herhangi bir modülü konuşlandıracak . Yani benim durumumda sadece ebeveyni konuşlandırmak.

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.