将WAR文件从一个Maven项目交给另一个Maven项目以与Embedded Jetty一起使用的最佳方法?

时间:2012-06-04 22:14:57

标签: maven maven-2 solr jetty

我认为这很简单,但有问题:

  • Project1属于战争类型。它创建了一个完整的webapp .war文件,包括一些Apache模块(solr / lucene)和一些自定义代码。
  • Project2是现有的应用程序。它需要启动嵌入式Jetty来对Project1的war文件进行查询。 (见下面的代码)

主要问题:

  • 当Project2实例化Jetty时,它需要传递WAR文件的完整路径,但每次都会更改。 Maven将版本号内容添加到Project1的war文件中。

救援组件?

  • 我可以使用自定义程序集,但无法从Project1中删除版本标记。

但我总是最终得到Project1-1.4.1-20120530.233546-2.war。这是一个更方便的地方,但名字仍然很奇怪。

Project2中的Jetty代码:

    // Context
    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    String jettyHome = System.getProperty( "jetty.home", ".." );
    String fullWarName = ...;    // Project1's WAR file. This path always changes
    webapp.setWar( fullWarName );
    // Server
    Server server = new Server( kPort ); // TODO: get from config
    server.setHandler(webapp);
    server.start();
    server.join();

其他考虑因素:

  • 我意识到有一个maven-jetty插件,但我不认为这是合适的。它似乎是针对单元测试的,而且我们的应用程序堆栈也没有在运行时使用maven来启动服务。
  • 我也知道Solr有一个完全嵌入的版本,不需要Web容器,但已经被弃用了一段时间,并不是一个好主意。

有没有更好的方法来重构这个项目?也许这不是“maven方式”?

1 个答案:

答案 0 :(得分:1)

事实证明我不需要装配(我在内部提出的建议),而是在主要的pom中有更容易的东西。此外,将战争解压缩在这里是一个不错的主意。

在Project1的pom.xml顶部,我有:

 <groupId>com.my.group</groupId>
 <artifactId>project-one</artifactId>
 <version>1.2.3-SNAPSHOT</version>
 <packaging>war</packaging>

这接近Project2的pom.xml的底部

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>unpack-webapp</id>
      <phase>package</phase>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
          <artifactItems>
           <artifactItem>
            <groupId>com.my.group</groupId>
            <artifactId>project-one</artifactId>
            <version>1.2.3-SNAPSHOT</version>
            <type>war</type>
            <overWrite>true</overWrite>
            <outputDirectory>${project.build.directory}/webapps/project-one</outputDirectory>
           </artifactItem>
         </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>

然后在启动Jetty时我有:

webapp.setWar( "target/webapps/project-one" );

我仍然认为某些Jetty设置可能存在问题,但我认为这是正确的方向。