2013-08-18 17 views
8

Çok modüllü bir web uygulamasına sahibim.Maven çok modüllü web uygulaması (Hot swap)

Parent 
| 
| - - Child 1 
| - - Child 2 
| - - Web 

Ve web projesi ben Web- sınıfları inşa IDE için kullanıldı projemi inşa etmek benim IDE kullanırken iki alt modüllerinden

bağlıdır:

yapıdır INF/sınıfları klasörü. Web sunucusu yeni sınıfları fark ettiğinden ve bu dosyaları yeniden başlattığından veya sıcak olarak dağıttığından bu güzeldi. Maven ile her şeyi her zaman sıfırdan paketlemem gerektiği gibi görünüyor.

Eğer mvn: temiz mvn: install mvn: war: inplace çalışmasını önlemek için maven'de bir yol bulmak istiyorum. Bunun yerine bir mvn: comile istiyorum, ve oradaki şeyler.

Umarım ne demek istediğimi anlarsınız. Her şeyden önce tüm proje kavanozlarını kurmanız ve bir şeyler güncellemeden önce bir savaş komutunu çalıştırmanız gerektiğinde web uygulamasının test edilmesi oldukça yavaştır.

web uygulamaları pom: Bu, bu soruna kendi geçici cevaptır

<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> 

    <parent> 
     ... 
    </parent> 

    <artifactId>web</artifactId> 
    <packaging>war</packaging> 

    <dependencies> 
     <dependency> 
     <groupId>bla.bla.bla</groupId> 
     <artifactId>bla_child1</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     </dependency> 
     <dependency> 
     <groupId>bla.bla.bla</groupId> 
     <artifactId>bla_child2</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.4</version> 
     </plugin> 
     <plugin> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>9.0.4.v20130625</version> 
      <configuration> 
       <scanIntervalSeconds>30</scanIntervalSeconds> 
       <webApp> 
        <contextPath>/blabla</contextPath> 
       </webApp> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 
</project> 
+0

? Eclipse gibi bazıları, [m2e] (http://eclipse.org/m2e/) ve [WTP] (http://projects.eclipse.org/projects/webtools) gibi eklentiler aracılığıyla maven ve webapps için iyi bir desteğe sahipler. –

+0

IntelliJ. IDE'de bunun için destek eksikliği yok, ama tamamen maven içinde yapılabileceğini düşünürdüm. – AnAmuser

+3

[maven jetty eklentisi] (http://maven.apache.org/plugins/maven-war-plugin/examples/rapid-testing-jetty6-plugin.html) ihtiyaçlarınızı karşılamıyor mu? Bir "mvn derlemesi" sonrası güncellenmiş 'hedef/sınıflar 'toplamaz mı? –

cevap

1

.

Eğer maven ile yapılabilirse güzel olurdu, ama bir çözüm bulamadım. Bu nedenle, web modülünün derleme aşamasına bir karınca hedefini bağladım.

Bu, muhtemelen herhangi bir yerde kullanılabilecek bir çözüm değildir, ancak benim durumumda çalışır.

web/pom.xml:

  <plugin> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <version>1.7</version> 
      <executions> 
       <execution> 
        <id>copy-modules</id> 
        <phase>compile</phase> 
        <configuration> 
        <target> 
         <delete dir="${project.basedir}\src\main\webapp\WEB-INF\classes"/> 
         <copy todir="${project.basedir}\src\main\webapp\WEB-INF\classes"> 
          <fileset dir="${main.basedir}\modules\child-1\target\classes"> 
           <include name="**/*.class"/> 
           <include name="**/*.xml"/> 
          </fileset> 
          <fileset dir="${main.basedir}\modules\child-2\target\classes"> 
           <include name="**/*.class"/> 
           <include name="**/*.xml"/> 
          </fileset> 
         </copy> 
        </target> 
        </configuration> 
        <goals> 
        <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

Şimdi dalgakıran ben, savaş ve daha önce gerekli şeyler yüklemek çok daha hızlı bir derleme yapmak her şey görür.

+0

Bu yaklaşımdaki sorun, kopyalanan sınıfların yeni bir bağımlılık getirmesi durumunda onu (bazı paylaşılan) lib klasörüne kopyalamayacağınızdır. Bu durumda, uygulama bir ClassNotFoundException ile kırılır. Cevabımı sildim, işte burada [bu betiğin maven portuna yapıştırma bağlantısı] (http://pastebin.com/CmRPyd8F) – linski

2

Sorununuza olası bir çözüm, maven-war-plugin ile (ya da en azından başka bir bağımlılığınız varsa 2 çocuğunu ve 2 çocuğunu hariç tut) bir skinny war oluşturmak ve çocuğun hedef/sınıf klasörlerini eklemek olabilir. sınıf yolunuza projeler. Bu Build Helper Maven Plugin's add-resource goal ile yapılabilir.

Yasal Uyarı: Bu kendimi deneyin vermedi ama teoride işe yarayabilir :) kullandığınız hangi IDE

+2

Denedim ve iskeleyi yeniden başlatmadan çalışmaz. Jetty, WAR modülündeki hedef/sınıflar hariç sınıf yolundaki değişiklikleri taramayacak gibi görünüyor. –

+1

Bkz. [Nasıl] (http://stackoverflow.com/a/2389464/679982), aşağıdakine. – linski

İlgili konular