2017-10-16 5 views
0

J'ai une application Boot Spring dans lequel j'ai intégré le Atmosphere Framework.org.atmosphere.cpr.AtmosphereMappingException dans le fichier exécutable de guerre Spring Boot

Ce fichier est le Application.java:

package com.myproject.something; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.web.support.SpringBootServletInitializer; 
import org.springframework.core.env.SimpleCommandLinePropertySource; 

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    public static void main(String[] args) { 
     SpringApplication app = new SpringApplication(Application.class); 
     addDefaultProfile(app, new SimpleCommandLinePropertySource(args)); 
     app.run(args); 
    } 

    private static void addDefaultProfile(SpringApplication app, SimpleCommandLinePropertySource source) { 
     if (!source.containsProperty("spring.profiles.active") 
       && !System.getenv().containsKey("SPRING_PROFILES_ACTIVE")) { 
      app.setAdditionalProfiles("dev"); 
     } 
    } 
} 

Afin d'avoir l'atmosphère Cadre intégré dans mon application Boot Spring, j'ai vaguement suivions this resource combinant des éléments du official Atmosphere Documentation.

J'ai fini les classes MyAtmosphereConfig.java et MyAtmosphereManagedService.java:

package com.myproject.something.atmosphere; 
import java.util.Collections; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import org.atmosphere.cpr.AtmosphereServlet; 
import org.atmosphere.cpr.ContainerInitializer; 
import org.springframework.boot.web.servlet.ServletContextInitializer; 
import org.springframework.boot.web.servlet.ServletRegistrationBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.Ordered; 

@Configuration 
public class MyAtmosphereConfig { 
    @Bean 
    public EmbeddedAtmosphereInitializer atmosphereInitializer() { 
     return new EmbeddedAtmosphereInitializer(); 
    } 

    @Bean 
    public ServletRegistrationBean atmosphereServlet() { 
     ServletRegistrationBean registration = new ServletRegistrationBean(new AtmosphereServlet(), "/myAtmosphereUrl"); 
     registration.addInitParameter("org.atmosphere.cpr.packages", "com.myproject.something.atmosphere"); 
     registration.setLoadOnStartup(1); 
     registration.setOrder(Ordered.HIGHEST_PRECEDENCE); 
     return registration; 
    } 

    private static class EmbeddedAtmosphereInitializer extends ContainerInitializer 
      implements ServletContextInitializer { 
     @Override 
     public void onStartup(ServletContext servletContext) throws ServletException { 
      onStartup(Collections.<Class<?>>emptySet(), servletContext); 
     } 
    } 
} 

package com.myproject.something.atmosphere; 
import java.util.concurrent.ConcurrentHashMap; 
import javax.inject.Inject; 
import org.atmosphere.config.service.Disconnect; 
import org.atmosphere.config.service.ManagedService; 
import org.atmosphere.config.service.Ready; 
import org.atmosphere.cpr.AtmosphereResource; 
import org.atmosphere.cpr.AtmosphereResourceFactory; 
import org.json.JSONException; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@ManagedService(path = "/myAtmosphereUrl") 
public class MyAtmosphereManagedService { 

    private final Logger log = LoggerFactory.getLogger(MyAtmosphereManagedService.class); 

    @Inject 
    public static AtmosphereResourceFactory factory; 

    @Inject 
    public AtmosphereResource resource; 

    @Ready 
    public void onReady() throws JSONException { 
     String atmosJSessionId = resource.getRequest().getRequestedSessionId(); 
     log.info("Initiating Atmosphere client connection with jsession = " + atmosJSessionId); 
    } 

    @Disconnect 
    public void onDisconnect() { 
     String atmosJSessionId = resource.getRequest().getRequestedSessionId(); 
     log.info("Unregistering Atmosphere client connection with jsession = " + atmosJSessionId); 
    } 
} 

je développe dans le Eclipse IDE, exécuter mon application Boot Spring comme Java Application. (Clic droit sur Application.java -> Exécuter en tant que -> Application Java)

Courir comme décrit de la façon ci-dessus -comme application Java à partir de l'Eclipse Front-IDE-End une partie de mon application peut accéder avec succès l'URL exposée par le cadre de l'atmosphère comme ceci:

(function() { 
    'use strict'; 
    setTimeout(function() { 
    // Setup Atmosphere client 
    var myAtmosphereUrl = 'http://localhost:8080/myAtmosphereUrl'; 
    var socket = atmosphere; 
    var subSocket; 

    var transport = 'sse'; 
    var request = { 
     url : myAtmosphereUrl, 
     contentType : "application/json", 
     logLevel : 'debug', 
     transport : transport, 
     trackMessageLength : true, 
     reconnectInterval : 5000 
    }; 
     request.onOpen = function(response) { 
     transport = response.transport; 
     request.uuid = response.request.uuid; 
     console.log("onOpen called!"); 
    }; 
     request.onMessage = function(response) { 
     transport = response.transport; 
     request.uuid = response.request.uuid; 
     console.log("onMessage called!"); 
    }; 
    subSocket = socket.subscribe(request); 
    }, 1000); 
})(); 

sur le Frontend côté dans la console du navigateur Je vois HTTP 200 le statut de co de et sur le côté Backend dans la console IDE Eclipse , il me donne le message de journal Initiating Atmosphere client connection with jsession = A4A8790C27D531FE7B2CD82B5B9C9447.

Malheureusement, après emballage mon projet dans un fichier de guerre exécutable et le déployer en tant que service sur un serveur Debian, il ne me laissant fonctionne plus avec un message d'erreur dans le journal sur le côté back-end:

2017-10-16 10:51:11.143 ERROR 21296 --- [http-nio-8080-exec-2] o.atmosphere.cpr.AsynchronousProcessor : No AtmosphereHandler found. Make sure you define it inside WEB-INF/atmosphere.xml or annotate using @___Service 
2017-10-16 10:51:11.146 ERROR 21296 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[atmosphereServlet] : Servlet.service() for servlet [atmosphereServlet] in context with path [] threw exception 

org.atmosphere.cpr.AtmosphereMappingException: No AtmosphereHandler found. Make sure you define it inside WEB-INF/atmosphere.xml or annotate using @___Service 
    at org.atmosphere.cpr.AsynchronousProcessor.action(AsynchronousProcessor.java:147) ~[atmosphere-runtime-2.4.5.jar!/:2.4.5] 
    at org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProcessor.java:115) ~[atmosphere-runtime-2.4.5.jar!/:2.4.5] 
    at org.atmosphere.container.Servlet30CometSupport.service(Servlet30CometSupport.java:68) ~[atmosphere-runtime-2.4.5.jar!/:2.4.5] 
    at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:2287) ~[atmosphere-runtime-2.4.5.jar!/:2.4.5] 
    at org.atmosphere.cpr.AtmosphereServlet.doPost(AtmosphereServlet.java:191) ~[atmosphere-runtime-2.4.5.jar!/:2.4.5] 
    at org.atmosphere.cpr.AtmosphereServlet.doGet(AtmosphereServlet.java:177) ~[atmosphere-runtime-2.4.5.jar!/:2.4.5] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) ~[spring-boot-1.4.1.RELEASE.jar!/:1.4.1.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:105) ~[spring-boot-actuator-1.4.1.RELEASE.jar!/:1.4.1.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    ... 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:107) ~[spring-boot-actuator-1.4.1.RELEASE.jar!/:1.4.1.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar!/:4.3.3.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:677) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.5.jar!/:8.5.5] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111] 

La console du navigateur me donne un code d'état HTTP 500 - Internal Server Error.

La création du fichier de guerre exécutable est déclenchée par la commande Maven maven package et est configuré dans le pom.xml de cette façon:

<?xml version="1.0" encoding="UTF-8"?> 
<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.myproject</groupId> 
    <artifactId>something</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>MySomething</name> 
    <description>My Something Description</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.1.RELEASE</version> 
    </parent> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-maven-plugin</artifactId> 
     <executions> 
      <execution> 
      <goals> 
       <goal>build-info</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <executable>true</executable> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    </build> 

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

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-rest-core</artifactId> 
      <version>2.6.6.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <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> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-mail</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-devtools</artifactId> 
      <optional>true</optional> 
     </dependency> 
     <dependency> 
      <groupId>org.atmosphere</groupId> 
      <artifactId>atmosphere-runtime</artifactId> 
      <version>2.4.5</version> 
     </dependency> 
     <dependency> 
      <groupId>org.atmosphere</groupId> 
      <artifactId>atmosphere-spring</artifactId> 
      <version>2.4.4</version> 
     </dependency> 
    </dependencies> 
</project> 

J'ai déjà essayé de placer un fichier atmosphere.xml dans le dossier WEB-INF de le fichier de guerre , mais il semble toujours que la servlet annotée avec @ManagedService ne soit pas ramassée.

C'était le contenu du atmosphere.xml, qui ne résout pas l'erreur:

<atmosphere-handlers> 
    <atmosphere-handler support-session="true" 
         context-root="/" 
         broadcaster="org.atmosphere.cpr.DefaultBroadcaster" 
         class-name="com.myproject.something.atmosphere.MyAtmosphereManagedService"> 
    </atmosphere-handler> 
</atmosphere-handlers> 

Quelqu'un peut-il me dire ce qui est erroné avec ma configuration ou est ce qui a probablement un bug lié aux versions mineures du embarqué Tomcat, atmosphère et botte de printemps?


EDIT:

Il est possible de reproduire cette erreur par clonage du official Atmosphere-Spring-Boot Sample project et en changeant le pom.xml pour emballer le projet dans un fichier war:

<?xml version="1.0" encoding="UTF-8"?> 
<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>org.atmosphere.samples</groupId> 
     <artifactId>atmosphere-samples</artifactId> 
     <version>2.5.0-SNAPSHOT</version> 
    </parent> 
    <artifactId>spring-boot-sample-atmosphere</artifactId> 
    <name>Spring Boot Atmosphere Sample</name> 
    <description>Spring Boot Atmosphere Sample</description> 
    <url>http://projects.spring.io/spring-boot/</url> 
    <packaging>war</packaging> 

    <organization> 
     <name>Pivotal Software, Inc.</name> 
     <url>http://www.spring.io</url> 
    </organization> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <version>${springboot-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.atmosphere</groupId> 
      <artifactId>atmosphere-runtime</artifactId> 
      <version>${atmosphere-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.webjars</groupId> 
      <artifactId>atmosphere-javascript</artifactId> 
      <version>2.2.8</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <version>${springboot-version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-websocket</artifactId> 
      <version>${spring-version}</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
       <version>${springboot-version}</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>repackage</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Répondre

0

J'ai trouvé deux correctifs pour ce.

Première solution:
1. Changé la version Boot Spring dans pom.xml à:

<parent> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-parent</artifactId> 
<version>1.5.7.RELEASE</version> 
</parent> 

2. Fait!

Deuxième solution: (si vous ne pouvez pas changer la version)

  1. Package votre projet dans un fichier jar, puis sont reconnus dans le @ManagedServices.

Remarque: Vous devrez peut-être copier des fichiers statiques (js et html) dans votre pom.xml avant l'emballage.