7

Dla mojej aplikacji Spring boot z wbudowanym tomcat, z powodu pewnych ograniczeń muszę zlikwidować spring-boot-maven-plugin i potrzebuję użyć maven-shade-plugin. Z poleceniem maven package mogłem z powodzeniem utworzyć plik jar. Jednak wszystkie moje kontrolery przestały działać i dają mi błąd 404. Również statyczna zawartość umieszczona w moim folderze zasobów nie jest już wyświetlana. Zawsze otrzymuję błąd 404.Spring Boot With Maven Shade Plugin - Kontrolery niezapisane (błąd 404)

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

uruchomić aplikację jak zwykle:

@SpringBootApplication 
public class MyMainClass{ 

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

Również musiałem stworzyć następujący EmbeddedServletContainerFactory fasoli, inaczej błąd zostanie wyrzucony.

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

Wreszcie, mam tylko jeden kontroler próbki,

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

Ten sam kod działa bez problemu, gdy używam wtyczki wiosna-boot-maven. Wkrótce po tym, jak zacząłem używać maven-shade-plugin, botki z powodzeniem działają. jednak wszystkie kontrolery dają mi błąd 404. Proszę, poprowadź mnie, jeśli robię coś złego.

+0

Byłoby pomocne, jeśli ktoś może stanowić przykład roboczy Spring Boot z Maven Wtyczka cieniowania. Dzięki. –

Odpowiedz

8

To jest bardzo proste, jeśli chcesz przenieść z wtyczką wiosna-boot-maven do Wtyczka maven-shade. Dodałem następujące informacje o wtyczce do pom.xml i problem został rozwiązany.

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

Zależność zarządzanie:

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

budować wtyczki:

<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

W uzupełnieniu do istniejącego, spróbuj użyć AppendingTransformer, na przykład:

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

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

+0

Dzięki za szybką odpowiedź .. Próbowałem i to nie działa. Wygląda na to, że migracja z wiosennej wersji boot-maven do wtyczki maven-shade-pluginy jest zła. Musisz dowiedzieć się, jak skonfigurować to poprawnie. –