Reputation: 267280
I have a Spring MVC application where I use hibernate, freemarker. It is setup as a multi-maven project. I am using IntelliJ ultimate.
Jetty starts fine, but when I go to
http://localhost:8080/
It simply outputs the folders of my project, and I can view my source code in the browser!
Here is my setup currently:
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();
My project layout is a multi-maven project (using intelli J), the layout is like:
/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
My web.xml is:
<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>
When I run this in IntelliJ (11 ulimitate), I get the following output:
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 [email protected]:8080
This obviously isn't working because when I run it using tomcat w/intelliJ I get a huge output for things like hibernate, spring, etc.
My pom.xml for the web module has:
..
<packaging>war</packaging>
..
Upvotes: 4
Views: 6033
Reputation: 2306
Have you tried to set defaultsDescriptor parameter
webAppContext.setDefaultsDescriptor(JETTY_HOME+"/etc/webdefault.xml");
JETTY_HOME is where you installed jetty, you can find JETTY_HOME/etc/webdefault.xml contains essential settings.
Upvotes: 0
Reputation: 5591
Instead of invoking Jetty manually from main.java
, refer to the Maven Jetty plugin in your pom.xml
, and start your application by running 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>
If instead your objective is to create an executable WAR
file with an embedded copy of Jetty, you'd want to approach the task as so:
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();
Upvotes: 0
Reputation: 964
If you aim for running this in production, and you already use maven to build your application I'd suggest that you create the actual war package first:
mvn clean package
Then, once you have your webapp built create a new Jetty server that runs from a war archive (and not the source code).
As the Jetty manual states, it should be something like this:
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();
Upvotes: 4
Reputation: 11805
you're probably missing your context loader listener.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
Upvotes: 2