带有Spring MVC的嵌入式Jetty

时间:2012-07-01 20:40:59

标签: java spring maven spring-mvc jetty

我的spring MVC和hibernate应用程序有一个多maven模块。

我的布局如下:

/myapp-web
/myapp-web/src/main/java
/myapp-web/src/main/webapp
/myapp-web/src/main/webapp/web-inf
/myapp-web/src/main/webapp/web-inf/web.xml
/myapp-web/src/main/webapp/web-inf/web-context.xml (spring wiring code etc)
/myapp-web/src/main/webapp/web-inf/config/hibernate.cfg.xml
/myapp-web/src/main/webapp/assets/... (folder for css, javascript, images)
/myapp-web/src/main/webapp/views (folders with freemarker .ftl files)

我的pom.xml:

    ..
    <packaging>war</packaging>
    ..
    <dependency>
        <artifactId>jetty-server</artifactId>
        <groupId>org.eclipse.jetty</groupId>
        <version>${jetty-version}</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlet</artifactId>
        <version>${jetty-version}</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-webapp</artifactId>
        <version>${jetty-version}</version>
    </dependency>

我有另一个嵌入式jetty实例,我成功设置了,我可以运行。我甚至设置了一个启动/停止脚本,因此它适用于Ubuntu。这不是一个spring mvc应用程序,所以它更容易,因为它没有web.xml文件等。 我创建了一个/assembly/assembly.xml文件,我是否也需要为spring mvc应用程序执行此操作?

然后我将其添加到我的pom.xml插件部分:

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>${maven-assembly-plugin}</version>
            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
        </plugin>
        <!-- jar plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>${maven-jar-plugin}</version>
            <configuration>
                <archive>

                </archive>
            </configuration>
        </plugin>
        <!-- jetty plugin -->
        <plugin>
            <!-- This plugin is needed for the servlet example -->
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>${jetty-version}</version>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>com.myapp.HttpServer</mainClass>
            </configuration>
        </plugin>

我的spring mvc应用程序是否需要执行相同的操作?

我在stackoverflow上发现了一些threads,但由于我没有使用ant,我无法理解ant部分。我也不确定如何移植它与maven一起工作:

我很惊讶除了单个servlet示例之外,没有一个关于如何执行此操作的良好参考。

我是否需要为此创建/assembly/assembly.xml文件,或者为Web应用程序创建不同的文件?

有人可以一步一步地向我解释这个问题,这样我就可以开始工作吗? 请问,我会发布我的项目所需的任何内容,但我想我已经涵盖了我目前的环境,即:

  • 使用多个maven设置
  • spring mvc
  • 休眠
  • 模板的freemarker
  • 文件夹结构如上所述

目标是能够部署此war文件,创建启动/停止脚本,以便将其部署到我的服务器并启动/停止jetty实例。

3 个答案:

答案 0 :(得分:7)

您不需要assembly.xml文件。

Jetty用于启动webapp,是否已经弹出。因此,您必须在主类中创建Jetty服务器,添加您的webapp上下文并启动服务器。您可以通过两种方式解决问题: - 使用“通用”Java EE服务器创建web.xml,并将此描述符添加到Jetty服务器。 - 使用servlet上下文programmaly在主类中加载Spring上下文: https://github.com/s4nchez/jetty-spring-mvc-jar

答案 1 :(得分:1)

assembly.xml文件主要用于创建zip文件。对于简单的Web存档,war文件maven的正常结构应该足够了。

您要求提供多模块示例。我建议寻找app fuse examples。即使你不使用app fuse框架,它也有很好的maven文件结构。我用快速启动创建了多模块hibernate spring mvc应用程序。

这是项目的目录结构。

D:.
    core
        src
            main
                java
                resources
                    META-INF
    src
        site
    web
        src
            main
                java
                    com
                    mycompany
                        webapp
                            controller
                            filter
                            jsp
                            listener
                            search
                            spring
                            taglib
                            util
            resources
                META-INF
            webapp
                common
                decorators
                images
                scripts
                    calendar
                WEB-INF

这是web项目pom.xml的相关部分。

<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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>com.mycompany</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
</parent>

<artifactId>web</artifactId>
<packaging>war</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>maven-jetty-plugin</artifactId>
            <version>6.1.26</version>
            <configuration>
                <contextPath>/</contextPath>
                <scanIntervalSeconds>3</scanIntervalSeconds>
                <scanTargetPatterns>
                    <scanTargetPattern>
                        <directory>src/main/webapp/WEB-INF</directory>
                        <excludes>
                            <exclude>**/*.jsp</exclude>
                        </excludes>
                        <includes>
                            <include>**/*.properties</include>
                            <include>**/*.xml</include>
                        </includes>
                    </scanTargetPattern>
                </scanTargetPatterns>
            </configuration>
        </plugin>
    </plugins>
...
<dependencies>
    <dependency>
        <groupId>${project.parent.groupId}</groupId>
        <artifactId>core</artifactId>
        <version>${project.parent.version}</version>
    </dependency>
 ...
</dependencies>
</project>

它依赖于核心项目。无论何时编译多模块项目,它都具有所有必要的部分。但是,如果您只需要从Web项目目录工作。您需要在核心目录中执行mvn install,这样它就会安装在您的本地存储库中,您的Web项目就可以使用它。如果您对核心项目进行了任何更改,则需要从主目录进行编译。否则,您可以正常使用来自Web项目目录的maven。

如您所见,不需要assembly.xml文件。您应该将assembly.xml文件用于比war文件更复杂的结构,例如将包含的自定义安装程序结构; war文件,帮助文件,Web服务器可执行文件,安装程序文件,用于将所有这些文件放在一起。

我可以在主目录中使用mvn package命令来创建war文件。我也可以在web项目目录中使用jetty:run命令来运行jetty并测试Web应用程序。

答案 2 :(得分:0)

我有一个非常类似的设置,我认为你可以使用最小的更改。我正在使用maven,spring,hibernate和freemarker等运行webapp。我不需要任何assembly.xml或ant任务。

我的方法是将应用程序打包为jar。然后这个罐子有一个主要的类,它开始码头并且基本上将自己部署为战争。有关详细信息,请参见此处:

http://draconianoverlord.com/2009/01/10/war-less-dev-with-jetty.html

可以轻松自定义此类以获取端口号等参数。

要运行该应用程序,我认为有两个不错的选择:

只需使用Java执行该类。这里的问题是正确设置类路径。为此我使用maven依赖:build-classpath目标。这将输出可在java执行命令中使用的完整类路径。这样做的缺点是你需要在运行它的机器上配置maven和maven repo。在我的情况下,这是可以接受的,这种方法非常有效。

或者你可以创建一个带有依赖项的可执行jar。为此,我推荐maven shade插件。请参阅http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html此方法的缺点是您最终会得到一个巨大的文件,因此很难解决类路径错误和依赖性问题。此外,如果库依赖于Meta-Inf文件,它们有时会相互覆盖。 Maven shade插件提供了解决此问题的方法,但它仍然是一个难以诊断的问题。

这两种方法都应该允许您保留当前的文件夹结构和web.xml等,但如果您有任何问题 - 请在评论中告诉我,我可以扩展答案。