7

Für meine Spring Boot-Anwendung mit eingebetteten Tomcat, aufgrund einiger Einschränkungen muss ich spring-boot-maven-plugin abschaffen und müssen maven-shade-plugin verwenden. Mit dem Befehl maven package konnte ich die JAR-Datei erfolgreich erstellen. Alle meine Controller funktionieren jedoch nicht mehr und geben mir 404 Fehler. Auch statische Inhalte, die in meinem Ressourcenordner abgelegt sind, werden nicht mehr bedient. Immer 404 Fehler erhalten.Spring Boot mit Maven Shade Plugin - Controller nicht gemappt (404 Fehler)

mein pom.xml

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <!-- Import dependency management from Spring Boot --> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-dependencies</artifactId> 
      <version>1.2.7.RELEASE</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.7</java.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
      </configuration> 
     </plugin> 


     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 

      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <filters> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 

         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>abc.MyMainClass</mainClass> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 


    </plugins> 
</build> 

Ich betreibe die Anwendung wie gewohnt:

@SpringBootApplication 
public class MyMainClass{ 

    public static void main(String[] args) { 
     SpringApplication.run(MyMainClass.class, args); 
    } 
} 

Auch ich hatte folgende EmbeddedServletContainerFactory Bohne zu schaffen, sonst wird ein Fehler ausgelöst werden.

@Bean 
public EmbeddedServletContainerFactory servletContainer() { 
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); 
    return tomcat; 
} 

Schließlich, ich habe nur einen eine Probe-Controller,

@RequestMapping(value = "/car", method = RequestMethod.GET) 
@ResponseBody 
public Car test() { 
    return new Car(); 
} 

Derselbe Code funktioniert ohne Problem, wenn ich Feder-boot-Maven-Plugin verwenden. Bald nachdem ich angefangen habe, maven-shade-plugin zu benutzen, bootet Tomcat erfolgreich. Alle Controller geben jedoch 404 Fehler. Bitte führe mich, wenn ich etwas falsch mache.

+0

Es wäre hilfreich, wenn jemand ein funktionierendes Beispiel des Frühlings-Boot mit Maven zur Verfügung stellen kann Schatten-Plugin. Vielen Dank. –

Antwort

8

Es ist sehr einfach, wenn Sie vom Frühling-boot-Maven-Plugin migrieren wollen Maven-Schatten-Plugin. Ich habe die folgenden Plugin-Informationen zu pom.xml hinzugefügt und das Problem behoben.

(https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-parent/1.2.6.RELEASE/spring-boot-starter-parent-1.2.6.RELEASE.pom)

Dependency Management:

<dependencyManagement> 
<dependencies> 
    <dependency> 
     <!-- Import dependency management from Spring Boot --> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-dependencies</artifactId> 
     <version>1.2.7.RELEASE</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
</dependencies> 

Build-Plugins:

<build> 


    <plugins> 


     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
      </configuration> 
     </plugin> 


     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <dependencies> 
       <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-maven-plugin</artifactId> 
        <version>1.2.7.RELEASE</version> 
       </dependency> 
      </dependencies> 
      <configuration> 
       <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope> 
       <createDependencyReducedPom>true</createDependencyReducedPom> 
       <filters> 
        <filter> 
         <artifact>*:*</artifact> 
         <excludes> 
          <exclude>META-INF/*.SF</exclude> 
          <exclude>META-INF/*.DSA</exclude> 
          <exclude>META-INF/*.RSA</exclude> 
         </excludes> 
        </filter> 
       </filters> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.handlers</resource> 
          </transformer> 
          <transformer 
           implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"> 
           <resource>META-INF/spring.factories</resource> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.schemas</resource> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>sg.butterfly.emenu.api.config.EmenuApp</mainClass> 
          </transformer> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 

</build> 
2

Neben dem bestehenden, versuchen AppendingTransformer verwenden, zum Beispiel:

<transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>abc.MyMainClass</mainClass> 
          </transformer> 
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
       <resource>META-INF/spring.handlers</resource> 
           </transformer> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
             <resource>META-INF/spring.schemas</resource> 
           </transformer> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
       <resource>META-INF/spring.tooling</resource> 
           </transformer> 

Doc Siehe: https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#AppendingTransformer

+0

Danke für die schnelle Antwort .. Ich habe es versucht und das funktioniert nicht. Scheint die Art, wie ich vom Spring-Boot-Maven Plugin zum Maven-Shade-Plugin migriere, falsch ist. Muss herausfinden, wie man es richtig konfiguriert. –