2013-03-18 17 views
7

Aplikacja tomcat7-maven-plugin umożliwia uruchomienie bieżącego projektu jako aplikacji sieci Web i można podać dodatkowe <webapps>, które będzie jednocześnie ładowane do tomcat.Wtyczka Tomcat - Maven: uruchamia webappy, ale nie ma bieżącego projektu.

Mój projekt nie jest aplikacją internetową, ale ma dostęp do usług świadczonych przez aplikacje internetowe. Jak więc można wdrożyć wiele aplikacji internetowych bez uruchamiania samego projektu jako aplikacji internetowej? Poniższy fragment Mavena prowadzi do FileNotFoundExceptions, ponieważ nie można znaleźć pliku context.xml.

<plugin> 
    <groupId>org.apache.tomcat.maven</groupId> 
    <artifactId>tomcat7-maven-plugin</artifactId> 
    <version>2.0</version> 
    <executions> 
    <execution> 
     <id>run-tomcat</id> 
     <phase>${tomcat.run.phase}</phase> 
     <goals><goal>run-war-only</goal></goals> 
     <configuration> 
     <webapps> 
      <webapp> 
      <contextPath>/my/app1</contextPath> 
      <groupId>...</groupId> 
      <artifactId>...</artifactId> 
      <version>...</version> 
      <type>war</type>  
      <asWebapp>true</asWebapp> 
      </webapp> 
      ... possibly more webapps ... 
     </webapps> 
     </configuration> 
    </execution> 
    <execution> 
     <id>tomcat-shutdown</id> 
     <phase>${tomcat.shutdown.phase}</phase> 
     <goals><goal>shutdown</goal></goals> 
    </execution> 
    </executions> 
</plugin> 

Obejście:

Chociaż sama aplikacja nie jest webapp, trzeba skonfigurować path i contextFile do niego:

<configuration> 
    <path>/my/non/existing/webapp</path> 
    <contextFile>src/test/resources/context.xml</contextFile> 
    <webapps> 
    ... 

Podany context.xml plik musi istnieć . Następujące pracował dla mnie, mimo że plik web.xml nie istnieje:

<?xml version="1.0" encoding="utf-8"?> 
<Context path="/my/non/existing/webapp"> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
</Context> 
+0

Czy możesz opublikować odpowiednie logi z pliku maven? – ben75

+0

A więc, Dominik, otrzymujesz odpowiedź nieco ponad godzinę po opublikowaniu pytania, ale nie masz grzeczności, by odpowiedzieć? –

+0

Dodałem obejście, które rozwiązuje problem. Ale wciąż mam nadzieję, że jest lepszy sposób na zrobienie tego ... – dokaspar

Odpowiedz

6

to prawdopodobnie nadużywa maven tomcat plugin, ale tutaj jest rozwiązanie znalazłem. BTW Twój fałszywy plik kontekstowy nie działa dla mnie, ponieważ potrzebowałem uruchomić inną aplikację webową, a moja aplikacja jest również aplikacją internetową.

Istnieje jira, która zapewni lepsze rozwiązanie naszego problemu. Zobacz https://issues.apache.org/jira/browse/MTOMCAT-228. Teraz moje rozwiązanie ...

Najpierw musisz skopiować wojnę do katalogu. Sugeruję katalog docelowy, aby można go było łatwo wyczyścić. W zależności od tego, czy chcesz wesprzeć bieg, czy też cele w okresie wojny, zależy od tego, czy po prostu skopiujesz wojnę, czy skopiujesz wojnę i rozpakujesz ją.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>${maven-dependency-plugin.version}</version> 
    <executions> 
    <execution> 
     <id>copy-war</id> 
     <goals> 
     <goal>copy</goal> 
     </goals> 
     <configuration> 
     <artifactItems> 
      <artifactItem> 
      <groupId>org.foo</groupId> 
      <artifactId>bar</artifactId> 
      <version>${bar.version}</version> 
      <type>war</type> 
      <overWrite>true</overWrite> 
      <outputDirectory>${project.build.directory}/bar/</outputDirectory> 
      </artifactItem> 
     </artifactItems> 
     <stripVersion>true</stripVersion> 
     </configuration> 
    </execution> 
    <execution> 
     <id>copy-war-unpack</id> 
     <goals> 
     <goal>unpack</goal> 
     </goals> 
     <configuration> 
     <artifactItems> 
      <artifactItem> 
      <groupId>org.foo</groupId> 
      <artifactId>bar</artifactId> 
      <version>${bar.version}</version> 
      <type>war</type> 
      <overWrite>true</overWrite> 
      <outputDirectory>${project.build.directory}/bar/bar</outputDirectory> 
      </artifactItem> 
     </artifactItems> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Następnie należy skonfigurować wtyczki tomcat, aby przejrzeć katalog lub wojnę, do której właśnie skopiowano w powyższym kroku. Poniżej przedstawiono konfigurację dla tomcat 6 & 7, która jest identyczna, jak identyfikator artefaktu.

<plugin> 
    <groupId>org.apache.tomcat.maven</groupId> 
    <artifactId>tomcat6-maven-plugin</artifactId> 
    <version>${tomcat6-maven-plugin.version}</version> 
    <configuration> 
    <port>8090</port> 
    <path>${default.rice.context.path}</path> 
    <warDirectory>${project.build.directory}/bar/bar.war</warDirectory> 
    <warSourceDirectory>${project.build.directory}/bar/bar</warSourceDirectory> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.apache.tomcat.maven</groupId> 
    <artifactId>tomcat7-maven-plugin</artifactId> 
    <version>${tomcat7-maven-plugin.version}</version> 
    <configuration> 
    <port>8090</port> 
    <path>${default.rice.context.path}</path> 
    <warDirectory>${project.build.directory}/bar/bar.war</warDirectory> 
    <warSourceDirectory>${project.build.directory}/bar/bar</warSourceDirectory> 
    </configuration> 
</plugin> 

Żeby było jasne, że nie ma potrzeby konfigurowania warDirectory lub potrzebujesz wykonanie kopii wojnie, jeśli tylko chcą wspierać tomcat: run. I odwrotnie, nie trzeba konfigurować warSourceDirectory lub wymagać wykonania kopii rozpakowuj wojny, jeśli chcesz tylko obsługiwać tomcat: run-war.

Ostatnia uwaga, ta zależność od kopii zapasowej działa również dobrze z wtyczką Jetty Maven, więc jeśli chcesz wspierać zarówno tomcat & molo to może być dobrym sposobem, aby to zrobić.

+0

BTW. Omawiałem różne rzeczy, takie jak zewnętrzne pliki serverXml, pliki kontekstowe i różne konfiguracje. Jest to jedyny sposób, w jaki udało mi się uzyskać wtyczkę tomcat, aby NIE wdrażać obecnej aplikacji internetowej. –

+0

Próbowałem tego samego bez rozpakowywania archiwum wojennego, tylko przy użyciu znacznika wsdlFile. Ale dostaję ten sam błąd. :( – Cherry

+0

Świetne rozwiązanie! Jeśli jednak typ projektu jest inny niż 'wojna', musisz wymusić wtyczkę tomcat, aby pominąć sprawdzanie z' ignorePackaging = true' .W moim przypadku budowałem słoik, który wymagał sfałszowanej usługi (wojna), aby wykonać pewne testy integracyjne Użyłem 'mojo:" copy: mojo i użyłem 'warDirectory = $ {project.build.directory}'/'warFile = mywar.war' i wszystko działa doskonale. – jmelanson

2

Po prostu miałem inny pomysł, jak rozwiązać ten problem w sposób podobny do maven. Chciałem to udokumentować tutaj, ponieważ mogłoby to pomóc innym. Nie testowałem jeszcze tego rozwiązania, ale nie widzę powodu, dla którego to by nie zadziałało.

Zasadniczo, jeśli chcesz uruchomić „inny” webapp niż obecnie przy użyciu molo lub tomcat wtyczek, co można zrobić, to w ten sposób:

Tworzenie kolejnego modułu maven w projekcie. Ten moduł będzie pustą nakładką wojenną do aplikacji internetowej, którą chcesz uruchomić. Następnie możesz umieścić wszystkie konfiguracje swojego pomostu lub tomcat w tym nowym module (lub po prostu scentralizować konfigurację pomostu i tomcat w macierzystym pom w ramach pluginManagement).Odtąd, tomcat & przeznaczony jest do uruchamiania "bieżącej" aplikacji, nie są wymagane specjalne konfiguracje hakowane.

+0

Wyglądało to na świetne hack, ale niestety wtyczka Tomcat Maven okazuje się mieć raczej ograniczoną obsługę nakładki. Zobacz np. ten wątek: https://mail-archives.apache.org/mod_mbox/tomcat-users/201204.mbox/%3CCANyrOm6g=a41ufKBfncxd6PvGSUA1M+-nWURpLDKxpBcDOhgJg @ mail.gmail.com% 3E –

+0

O tak, też natknąłem się na problemy z nakładkami .Poproś o licznych problemach z nakładką JIRA. Mam nadzieję, że naprawią je w wersji 3.0, która prawdopodobnie wyjdzie na poparcie tomcat 8. https://issues.apache.org/jira/browse/MTOMCAT –