首页 文章

Maven多模块Web应用程序(热插拔)

提问于
浏览
8

我有一个多模块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,然后就是那里的东西 .

我希望你明白我的意思 . 当您需要构建所有项目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>

2 回答

  • 2

    您的问题的一个可能的解决方案可能是使用maven-war-plugin构建skinny war(或者如果您还有其他依赖项,至少排除child1和child2)并将子项目的target / classes文件夹添加到类路径 . 这可以通过Build Helper Maven Plugin's add-resource goal来完成 .

    免责声明:我自己没试过,但从理论上说它可以工作:)

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

    现在每次我做编译都会看到码头,这比安装,战争和以前需要的东西要快得多 .

相关问题