2013-08-18 33 views
8

我有一个多模块Web应用程序。Maven多模块Web应用程序(热插拔)

结构为:

Parent 
| 
| - - Child 1 
| - - Child 2 
| - - Web 

和Web项目依赖于两个子模块

当使用我的IDE构建项目中,我使用的IDE建设类的WEB- INF/classes文件夹。这很好,因为Web服务器注意到新的类,并重新启动或热部署这些文件。有了maven,我似乎每次都必须从零开始打包整个事情。

我想在maven中找到一种方法,以避免运行mvn:clean mvn:install mvn:war:inplace。相反,我想要一个mvn:comile,然后是那里的东西。

我希望你明白我的意思。测试Web应用程序的速度非常慢,因为在更新事件之前,必须始终构建所有项目JAR并运行som war命令。

的Web应用程序POM:

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

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

    <dependencies> 
     <dependency> 
     <groupId>bla.bla.bla</groupId> 
     <artifactId>bla_child1</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     </dependency> 
     <dependency> 
     <groupId>bla.bla.bla</groupId> 
     <artifactId>bla_child2</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.4</version> 
     </plugin> 
     <plugin> 
      <groupId>org.eclipse.jetty</groupId> 
      <artifactId>jetty-maven-plugin</artifactId> 
      <version>9.0.4.v20130625</version> 
      <configuration> 
       <scanIntervalSeconds>30</scanIntervalSeconds> 
       <webApp> 
        <contextPath>/blabla</contextPath> 
       </webApp> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 
</project> 
+0

您使用的是什么IDE?有些像Eclipse一样,通过像[m2e](http://eclipse.org/m2e/)和[WTP](http://projects.eclipse.org/projects/webtools)这样的插件对maven和webapps提供了很好的支持。 –

+0

IntelliJ。 IDE中并不缺乏对它的支持,但我认为这完全可以在maven中完成。 – AnAmuser

+3

[maven jetty插件](http://maven.apache.org/plugins/maven-war-plugin/examples/rapid-testing-jetty6-plugin.html)不适合您的需求吗?在'mvn compile'之后没有选择更新的'target/classes'? –

回答

1

这是我自己的临时回答这个问题。

这将是很好,如果它可以与maven完成,但我一直没能找到解决方案。因此,我已经将一个ant目标绑定到web模块的编译阶段。

这可能不是一个可以在任何地方使用的解决方案,但它适用于我的情况。

网/ pom.xml中:

  <plugin> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <version>1.7</version> 
      <executions> 
       <execution> 
        <id>copy-modules</id> 
        <phase>compile</phase> 
        <configuration> 
        <target> 
         <delete dir="${project.basedir}\src\main\webapp\WEB-INF\classes"/> 
         <copy todir="${project.basedir}\src\main\webapp\WEB-INF\classes"> 
          <fileset dir="${main.basedir}\modules\child-1\target\classes"> 
           <include name="**/*.class"/> 
           <include name="**/*.xml"/> 
          </fileset> 
          <fileset dir="${main.basedir}\modules\child-2\target\classes"> 
           <include name="**/*.class"/> 
           <include name="**/*.xml"/> 
          </fileset> 
         </copy> 
        </target> 
        </configuration> 
        <goals> 
        <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

现在码头看到,每次我做了编译,这比安装,战争,那是以前所需要的东西更快。

+0

这种方法的问题是,如果正在复制的类引入新的依赖关系,则不会将其复制到(某些共享的)lib文件夹。在这种情况下,应用程序将会破坏一个ClassNotFoundException。我删除了我的答案,所以这里是一个[pastebin链接到这个脚本的maven端口](http://pastebin.com/CmRPyd8F) – linski

2

对于你的问题可能的解决方案可能是用maven-war-plugin构建skinny war(或者至少在你还有其他依赖的情况下排除child1和child2)并添加子目录/项目到您的类路径。这可以通过Build Helper Maven Plugin's add-resource goal完成。

声明:我没有自己尝试,但理论上它可以工作:)

+2

我试过了,如果不重新启动jetty,它就无法工作。除了WAR模块中的target/classes外,Jetty似乎不扫描类路径上的更改。 –

+1

请看这里[how](http://stackoverflow.com/a/2389464/679982),upvoted。 – linski