2013-08-18 11 views
8

Mam aplikację internetową z wieloma modułami.Wielomodułowa aplikacja sieciowa Maven (wymienianie na gorąco)

Struktura jest:

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

A projekt internetowej zależy od dwóch modułów podrzędnych

Kiedy używając mojego IDE zbudować mojego projektu byłem przyzwyczajony do IDE budowaniu zajęcia w WEB- Folder INF/classes. To było miłe, ponieważ serwer WWW zauważył nowe klasy i albo zrestartował, albo uruchomił te pliki na gorąco. Z mavenem wydaje się, że za każdym razem muszę wszystko spakować od zera.

Chciałbym znaleźć sposób w maven taki, że mogę uniknąć uruchamiania mvn: clean mvn: install mvn: war: inplace. Zamiast tego chciałbym mvn: comile, a następnie rzeczy właśnie tam.

Mam nadzieję, że rozumiesz o co mi chodzi. Testowanie aplikacji internetowej jest bardzo powolne, kiedy zawsze musisz zbudować wszystkie słoiki projektu i uruchomić polecenie "som war", zanim wszystko zostanie zaktualizowane.

Aplikacje web pom:

<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

Jakiego IDE używasz? Niektóre, takie jak Eclipse, mają dobre wsparcie dla mavenów i webappów poprzez wtyczki takie jak [m2e] (http://eclipse.org/m2e/) i [WTP] (http://projects.eclipse.org/projects/webtools). –

+0

IntelliJ. To nie jest brak wsparcia dla niego w IDE, ale myślę, że można to zrobić całkowicie w maven. – AnAmuser

+3

A co z wtyczką [maven jetty] (http://maven.apache.org/plugins/maven-war-plugin/examples/rapid-testing-jetty6-plugin.html) nie odpowiada Twoim potrzebom? Czy nie zbiera zaktualizowanych 'target/classes' po' 'mvn compile'? –

Odpowiedz

1

To jest mój własny tymczasowa odpowiedź na ten problem.

Byłoby miło, gdyby można to było zrobić z mavenem, ale nie byłem w stanie znaleźć rozwiązania. Dlatego też związałem mrówkę docelową z fazą kompilacji modułu webowego.

To prawdopodobnie nie jest rozwiązanie, które można wykorzystać w dowolnym miejscu, ale działa w moim przypadku.

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> 

Teraz pomost widzi za każdym razem robię kompilacji, która jest znacznie szybsza niż instalacja, wojny i rzeczy, które było potrzebne wcześniej.

+0

Problem z tym podejściem polega na tym, że jeśli kopiowane klasy wprowadzają nową zależność, nie będzie jej kopiować do (niektórych udostępnionych) folderów lib. W takim przypadku aplikacja zostanie zerwana z wyjątkiem ClassNotFoundException. Usunąłem moją odpowiedź, więc tutaj jest link [pastebin do maven portu tego skryptu] (http://pastebin.com/CmRPyd8F) – linski

2

Możliwym rozwiązaniem twojego problemu może być zbudowanie skinny war z wtyczką maven-war (lub przynajmniej wykluczenie child1 i child2, jeśli masz również inne zależności) i dodanie folderów target/classes tego dziecka. projekty do swojej ścieżki klas. Można to zrobić za pomocą Build Helper Maven Plugin's add-resource goal.

Nota prawna: Sam nie próbowałem, ale teoretycznie może działać :)

+2

Próbowałem go i nie działa bez restartowania pomostu. Wygląda na to, że Jetty nie skanuje zmian w ścieżce klas z wyjątkiem celu/klas w module WAR. –

+1

Zobacz tutaj [jak] (http://stackoverflow.com/a/2389464/679982), przegłosowano. – linski

Powiązane problemy