如何通过jetty-maven-plugin热重新部署非活动的maven项目

时间:2014-10-01 21:08:00

标签: maven jetty maven-jetty-plugin

我正在尝试评估jetty的快速开发或目前在tomcat上运行的项目。我的配置看起来像

        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.2.3.v20140905</version>
            <configuration>
                <scanIntervalSeconds>3</scanIntervalSeconds>
                <webApp>
                    <descriptor>${project.build.directory}/${project.build.finalName}/WEB-INF/web.xml</descriptor>
                    <resourceBases>
                        <directory>${basedir}/src/main/webapp</directory>
                        <directory>${basedir}/../SharedWeb/src/main/webapp</directory>
                    </resourceBases>
                    <allowDuplicateFragmentNames>true</allowDuplicateFragmentNames>
                    <contextPath>/test</contextPath>
                </webApp>
            </configuration>
        </plugin>

我通过war覆盖机制依赖于SharedWeb战争进行主战。我为两个maven项目指定了resourceBases,因此可以自动扫描资源中的更改并立即重新加载,并且所有工作正常。此外,当我在主战中编译类时,jetty会自动重启,重新加载最新的更改。但是当我尝试更改SharedWeb项目中的任何类并编译它时,该类不会重新加载。我只是想知道是否有办法让embed jetty自动从SharedWeb重新加载类?我知道jetty-maven-plugin使用来自本地maven存储库的SharedWeb war,因此我需要先安装SharedWeb工件才能看到任何更改。所以我没有很高的期望,但也许我错过了一些东西。

2 个答案:

答案 0 :(得分:1)

因为对于这个问题(又名<scanTarget>)来说似乎不是一个很好的先验答案,我只会发布这个新的并将标题调整为让以后更容易找到。

您要查找的内容为<scanTarget>,因为这样您就可以自定义更改内容的扫描位置,从而触发热重新展开。

jetty-maven-plugin故意不会为自定义<resourceBases>设置此项,因为在很多合法用例中,这会导致攻击性/过于频繁/无限次重新部署。决定最好打破#34;约定优于配置&#34;对于<scanTarget>条目,允许开发人员决定应该扫描哪些更改。

  <plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.2.3.v20140905</version>
    <configuration>
        ...
        <scanIntervalSeconds>3</scanIntervalSeconds>
        <scanTargets>
            <scanTarget>${basedir}/../SharedWeb/src/main/webapp/</scanTarget>
            <scanTarget>${basedir}/../SharedWeb/target/classes/</scanTarget>
        </scanTargets>
    </configuration>
  </plugin>

答案 1 :(得分:1)

伊万,

插件正在使用依赖项中的类和资源 战争,而不是你添加的战争。该 只是告诉码头观看该位置并重新部署 它会改变 - 它不会把它放到类路径上。

你需要告诉码头使用你的类和资源 依赖战争的项目,而不是战争神器。

做类似的事情:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.2.3.v20140905</version>
    <configuration>
        <webApp>
            <!-- tell jetty to use the classes from the dependency
webapp project directly -->
            <extraClassPath>${basedir}/../SharedWeb/target/classes</extraClassPath>

           <!-- tell jetty to use both this project's static
resources, and those of the dependency webapp project -->
           <resourceBases>
               <directory>${basedir}/src/main/webapp</directory>
               <directory>${basedir}/../SharedWeb/src/main/webapp</directory>
           </resourceBases>
        </webApp>
        <scanIntervalSeconds>3</scanIntervalSeconds>
       <!-- tell jetty to watch the dependency webapp project classes
dir for changes -->
        <scanTargets>
            <scanTarget>${basedir}/../SharedWeb/target/classes/</scanTarget>
        </scanTargets>
    </configuration>
  </plugin>