2012-07-01 57 views
2

我有一個用於我的spring MVC和hibernate應用程序的多重maven模塊。嵌入式跳臺MVC

我的佈局如下:

/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> 

我有嵌入的碼頭,我成功設立的,我可以運行的另一個實例。我甚至設置了一個啓動/停止腳本,以便在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。我也不知道如何移植到maven的工作:

我很驚訝,沒有一個單一的良好參考如何做到這一點,而不是單個servlet的例子。

是否需要爲此創建/assembly/assembly.xml文件,或者針對Web應用程序,情況有所不同?

有人可以解釋這一步一步一步,所以我可以得到這個工作? 請讓我將張貼必要的東西爲我的項目,但我想我涵蓋了所有我現在的環境了,即:

  • 使用多行家設置
  • Spring MVC的
  • 冬眠
  • 爲模板的freemarker
  • 文件夾結構上面

給出的目標是能夠部署這個娃r文件,創建啓動/停止腳本,以便我可以將其部署到我的服務器並啓動/停止jetty實例。

+0

如果你堅持標準的maven項目佈局(你似乎做了什麼),maven jetty:run命令將從相應的路徑中選擇你的web應用程序,而不是加載.war。在我使用的簡單項目中,不需要額外的配置,足以進行測試和開發。如果你需要部署生產。戰爭,看看[貨物插件](http://cargo.codehaus.org/Maven2+plugin)? – Pyranja

+0

我不想在本地使用mvn jetty運行碼頭:運行命令,這是爲了部署。 – Blankman

回答

7

你不需要assembly.xml文件。

碼頭是用來啓動web應用程序,或不是。所以,你必須在主類中創建一個Jetty服務器,添加你的webapp上下文並啓動服務器。您可以通過兩種方式解決您的問題: - 使用「公用」Java EE服務器創建web.xml,並將此描述符添加到Jetty服務器。 - 使用servlet上下文編程加載主類中的Spring上下文: https://github.com/s4nchez/jetty-spring-mvc-jar

1

assembly.xml文件主要用於創建zip文件。對於簡單的Web歸檔,war文件的maven的正常結構應該足夠了。

您要求提供多模塊示例。我建議尋找app fuse examples。即使你不使用應用保險絲框架,它也具有良好的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文件更復雜的結構,例如,將包含的自定義安裝程序結構;戰爭文件,幫助文件,網絡服務器可執行文件,將所有這些文件放在一起的安裝程序文件。

我可以在主目錄中使用mvn package命令來創建war文件。另外,我可以在web項目目錄中使用jetty:run命令運行jetty並測試Web應用程序。

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遮罩插件。請參閱http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html這種方法的缺點是最終會生成一個巨大的文件,以致類路徑錯誤和依賴項問題難以解決。另外,如果庫依賴於Meta-Inf文件,它們有時可以相互覆蓋。 Maven shade插件提供瞭解決這個問題的方法,但它仍然很難診斷問題。

這兩種方法都應該允許您保留當前的文件夾結構和web.xml等,但如果您確實有任何問題 - 請在評論中告訴我,我可以擴展答案。