2014-09-23 19 views
12

Voglio creare un file di guerra senza tomcat incorporato con Maven. Qui la parte rilevante del mio pomspring boot war senza tomcat incorporato

... 
<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.1.6.RELEASE</version> 
</parent> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-thymeleaf</artifactId> 
    </dependency> 
    <!-- Add tomcat only if I want to run directly --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 
... 

Come mai se corro pacchetto mvn ottengo una guerra, in cui il gatto * .jar sono in una cartella a condizione-lib, ma ancora nella lib-cartella. Ho letto build-tool-plugins-maven-packaging, ma non riesco a trovare cosa c'è che non va.

So che l'idea principale è quella di eseguirlo come un'applicazione, ma come mai il nostro cliente vuole installarlo sul suo server di applicazioni.

+0

Il fatto che i barattoli siano ancora lì non significa che non puoi schierarlo come una guerra. Puoi schierarlo perfettamente così com'è. Assicurati di escludere tomcat dalla dipendenza 'spring-boot-starter-web'. –

+0

Grazie è stato. – niels

+1

@niels, hai modificato questa domanda e dal momento che la revisione * 2 * include la risposta alla tua domanda. Che dire di tornare alla risposta iniziale e fornire una risposta separata? – Abdull

risposta

17

Seguendo il suggerimento di M. Deinum ho escluso la dipendenza da gatto.

Con il seguente pom.xml (snippet pertinente) uno maven clean package ha il risultato che non desidero ottenere.

... 
<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.1.6.RELEASE</version> 
</parent> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-thymeleaf</artifactId> 
    </dependency> 
    <!-- Add tomcat only if I want to run directly --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 
... 
+0

Ma se lo spring-boot-starter-tomcat è commentato, come si esegue l'app? L'ho provato in questo modo e l'ho implementato in un contenitore di tomcat, ma ho ricevuto messaggi di errore. Tutto simile a: org.apache.catalina.startup.ContextConfig checkHandlesTypes AVVISO: impossibile caricare la classe [org.apache.tomcat.util.descriptor.web.NameRule] per verificare l'annotazione @HandlesTypes di uno o più ServletContentInitializers. java.lang.ClassNotFoundException: org.apache.tomcat.util.descriptor.web.NameRule ecc. –

+0

È possibile distribuire la guerra in un servlet-contenitore arbitrario. Se la tua applicazione non ha bisogno delle classi di tomcat, funziona in questo modo. È possibile che tu abbia bisogno di compilare le lezioni di tomcat? Come si compila? mvn dalla linea di comando? Assicurati di fare un mvn pulito all'inizio. – niels

+0

Uso Gradle, l'ho già capito. Il processo di compilazione (bootRepackage) produce due elementi, uno con e uno senza il contenitore Tomcat incorporato. Venuto fuori ho preso l'artefatto sbagliato per la distribuzione esterna di Tomcat - dovrei fare la guerra senza il Tomcat incorporato allora. –

6

Non sono sicuro che sia il modo di avvio primaverile di farlo, ma è possibile escludere i vasi Tomcat utilizzando la configurazione maven-war-plugin. Cioè, aggiungere il seguente al vostro pom.xml:

<build> 
    <plugins> 
     ... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <packagingExcludes>WEB-INF/lib/tomcat-*.jar</packagingExcludes> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Usando questo approccio, ha generato la guerra non è eseguibile (non può essere eseguito su riga di comando utilizzando java-jar), ma può essere implementato solo per qualsiasi servlet container

3

Ho avuto lo stesso bisogno ma rimuovere la dipendenza citata non ha funzionato. Sono stato in grado di ottenere il file WAR aggiungendo questa dipendenza <packaging>war</packaging> al mio file pom.

Ho usato questo articolo Spring come guida ... condividendo così questo può aiutare anche altre persone.

Problemi correlati