4 votes

Jetty ne détecte pas mon application de printemps.

J'ai une application Spring MVC où j'utilise hibernate, freemarker. Elle est configurée comme un projet multi-maven. J'utilise IntelliJ ultimate.

Jetty démarre bien, mais lorsque je vais dans la section

http://localhost:8080/

Il affiche simplement les dossiers de mon projet, et je peux visualiser mon code source dans le navigateur !

Voici ma configuration actuelle :

    final Server server = new Server(8080);

    ProtectionDomain domain = HttpServer.class.getProtectionDomain();
    URL location = domain.getCodeSource().getLocation();

    WebAppContext webAppContext = new WebAppContext();
    webAppContext.setResourceBase(location.toExternalForm());
    webAppContext.setDescriptor(location.toExternalForm() + "/WEB-INF/web.xml");
    webAppContext.setContextPath("/");
    webAppContext.setParentLoaderPriority(true);

    server.setHandler(webAppContext);

    server.start();
    server.join();

La disposition de mon projet est un projet multi-maven (utilisant intelli J), la disposition est comme :

/myapp/src/main/java/main.java (this contains the above code to start jetty)
/myapp/src/main/webapp
/myapp/src/main/webapp/assets
/myapp/src/main/webapp/WEB-INF
/myapp/src/main/webapp/WEB-INF/web-context.xml (spring config file)
/myapp/src/main/webapp/WEB-INF/web.xml
/myapp/src/main/webapp/WEB-INF/views/ (parent folder for my freemarker template files)
/myapp/src/main/webapp/WEB-INF/views/home/index.ftl 

Mon web.xml est :

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath*:log4j.properties</param-value>
</context-param>

 <servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/web-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Lorsque je l'exécute dans IntelliJ (11 ulimitate), j'obtiens la sortie suivante :

2012-08-15 19:17:11,611 [main] INFO  org.eclipse.jetty.server.Server - jetty-7.6.2.v20120308
2012-08-15 19:17:11,886 [main] INFO  org.eclipse.jetty.webapp.StandardDescriptorProcessor - NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2012-08-15 19:17:11,962 [main] INFO  org.eclipse.jetty.server.handler.ContextHandler - started o.e.j.w.WebAppContext{/,file:/Users/me/projects/myapp/myapp-web/target/classes/}
2012-08-15 19:17:12,021 [main] INFO  org.eclipse.jetty.server.AbstractConnector - Started SelectChannelConnector@0.0.0.0:8080

Cela ne fonctionne manifestement pas, car lorsque je l'exécute en utilisant tomcat w/intelliJ, j'obtiens une sortie énorme pour des choses comme hibernate, spring, etc.

Mon pom.xml pour le module web a :

..
 <packaging>war</packaging>
..

4voto

Marek Dec Points 779

Si vous avez l'intention de l'utiliser en production et que vous utilisez déjà maven pour construire votre application, je vous suggère de créer d'abord le paquet war :

mvn clean package

Ensuite, une fois que vous avez construit votre application web, créez un nouveau serveur Jetty qui fonctionne à partir d'une archive war (et non du code source).

Comme la jetée manuel états, ça devrait être quelque chose comme ça :

    Server server = new Server(8080);

    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    webapp.setWar("path_to_the_war_file/your_app.war");
    server.setHandler(webapp);

    server.start();
    server.join();

0voto

mikaelhg Points 647

Au lieu d'invoquer Jetty manuellement à partir de main.java Pour plus d'informations, reportez-vous au plugin Maven Jetty dans votre fichier pom.xml et lancez votre application en exécutant mvn jetty:run

<build>
  <plugins>
    <plugin>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>jetty-maven-plugin</artifactId>
      <version>8.1.4.v20120524</version>
    </plugin>
  </plugin>
</build>

Si au contraire votre objectif est de créer un exécutable WAR avec une copie intégrée de Jetty, vous devez aborder la tâche de la manière suivante :

    final Connector connector = new SelectChannelConnector();
    connector.setPort(8080);

    final Server server = new Server();
    server.addConnector(connector);
    server.setStopAtShutdown(true);

    final WebAppContext context = new WebAppContext();
    context.setContextPath("/");
    context.setServer(server);

    final ProtectionDomain protectionDomain = Main.class.getProtectionDomain();
    final URL location = protectionDomain.getCodeSource().getLocation();
    context.setWar(location.toExternalForm());
    server.addHandler(context);

    server.start();
    server.join();

0voto

Ted Shaw Points 1355

Avez-vous essayé de définir le paramètre defaultsDescriptor

webAppContext.setDefaultsDescriptor(JETTY_HOME+"/etc/webdefault.xml");

JETTY_HOME est l'endroit où vous avez installé Jetty, vous pouvez trouver JETTY_HOME/etc/webdefault.xml qui contient les paramètres essentiels.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X