我的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应用程序创建不同的文件?
有人可以一步一步地向我解释这个问题,这样我就可以开始工作吗? 请问,我会发布我的项目所需的任何内容,但我想我已经涵盖了我目前的环境,即:
目标是能够部署此war文件,创建启动/停止脚本,以便将其部署到我的服务器并启动/停止jetty实例。
答案 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等,但如果您有任何问题 - 请在评论中告诉我,我可以扩展答案。