Maven如何在编译时处理WAR依赖?

时间:2012-03-01 09:39:43

标签: rest maven war dependency-management

我正在使用Maven 3来处理(大型)项目。该项目使用Scala,Akka和Spray框架定义了一组REST服务。每个服务都被定义为一个独立的项目,由于“mvn package”命令,它产生了一个WAR。

我必须将这些不同的服务“组装”成一个“系统”,即在单个WAR中为特定目的部署的这些服务的子集。 Maven WAR overlay作为第一印象很好:只需创建一个新项目,并添加要作为依赖项包含的服务。

<dependencies>
  <dependency>
    <groupId>net.modelbased.sensapp.service</groupId>
    <artifactId>net.modelbased.sensapp.service.metamodel.repository</artifactId>
    <version>0.0.1</version>
    <type>war</type>
  </dependency>     
</dependencies>

效果很好,独立服务中包含的类包含在最终的WAR中。

jar tf target/net.modelbased.sensapp.system.envision-0.0.1-SNAPSHOT.war 
[...]
WEB-INF/classes/net/modelbased/sensapp/service/metamodel/repository/ModelLister.class
[...]

但是...... Spray框架需要实现引导程序,即加载已实现服务的类。必须编译此文件,因为它是一个普通的scala类。但看起来maven在编译类路径中没有包含WAR依赖项。

我看到了WARpath插件(http://static.appfuse.org/maven-warpath-plugin/)......但它看起来并不过时。是否有一种“标准”方式来做我想做的事情(即在编译类路径中包含一个WAr)。

聚苯乙烯。该项目的一个要求是每个服务必须可以作为独立的工件进行部署。解决方案可以是将服务的核心实现为JAR项目,还提供一个WAR项目,其中包括对JAR和相关配置文件的重新声明。但它会将定义的项目数量乘以2,这在某种程度上并不是最优的......

2 个答案:

答案 0 :(得分:0)

您提出的解决方案看起来不错。

您可以从类中构建一个jar,然后使用此jar作为依赖项构建一个war。

您可能也可以在一个项目中执行此操作,我可以看到不需要两个不同的项目。

答案 1 :(得分:0)

您可以使用maven-war-plugin的配置,它提供了一种从src / main / java文件中创建单独jar文件的方法。 您必须添加配置项:

  <configuration>
    <archiveClasses>true</archiveClasses>
    <attachClasses>true</attachClasses>
  </configuration>

这将使用分类器创建一个单独的jar文件,该文件可用作通常的依赖项。