【问题标题】:How does Maven handle WAR dependencies at compile time?Maven 在编译时如何处理 WAR 依赖关系?
【发布时间】:2012-03-01 09:39:43
【问题描述】:

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

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

<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,这在某种程度上并不是最优的......

【问题讨论】:

    标签: rest maven war dependency-management


    【解决方案1】:

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

    你可以从你的类中构建一个 jar,然后使用这个 jar 作为依赖来构建一个战争。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 2017-11-10
        • 1970-01-01
        • 2015-05-11
        相关资源
        最近更新 更多