【问题标题】:Maven war packaging of transitive modules传递模块的Maven战争包装
【发布时间】:2013-06-10 02:15:12
【问题描述】:

我有一个网络应用程序,它提供了我编写的 API 的实现。所以,我有一组三个工件:my-webapp (war)、my-api (jar) 和 my-impl (jar)。 pom 很简单,其中:my-impl 将 my-api 列为依赖项,而 my-webapp 将 my-impl 列为依赖项。当我运行 mvn install 时,我希望 my-impl 在打包到 WEB-INF/lib 期间拉入 my-api。但它只引入了 my-impl。

我在这里做错了什么?还是预计不会以这种方式工作?

更新:如果这有帮助,我会不断收到此警告:

[WARN] mine:my-impl:jar:1.1.0.0 的 POM 无效,可传递 依赖项(如果有)将不可用,启用调试日志记录 更多详情

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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>mine</groupId>
    <artifactId>my-webapp-packager</artifactId>
    <version>${product.version}</version>
    <packaging>pom</packaging>
    <name>Webapp Packager</name>
    <description>Webapp Packager</description>
    <modules>
        <module>my-webapp</module>
        <module>my-api</module>
        <module>my-impl</module>
    </modules>
</project>

Web 应用程序:

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>mine</groupId>
        <artifactId>my-webapp-packager</artifactId>
        <version>${product.version}</version>
    </parent>
    <artifactId>my-webapp</artifactId>
    <packaging>war</packaging>
    <name>Webapp</name>
    <description>Webapp</description>
    <dependencies>
        <dependency>
            <groupId>mine</groupId>
            <artifactId>my-impl</artifactId>
            <version>${product.version}</version>
        </dependency>
    </dependencies>
</project>

API:

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>mine</groupId>
        <artifactId>my-webapp-packager</artifactId>
        <version>${product.version}</version>
    </parent>
    <artifactId>my-api</artifactId>
    <packaging>jar</packaging>
    <name>API</name>
    <description>API</description>
</project>

实施:

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>mine</groupId>
        <artifactId>my-webapp-packager</artifactId>
        <version>${product.version}</version>
    </parent>
    <artifactId>my-impl</artifactId>
    <packaging>jar</packaging>
    <name>Impl</name>
    <description>Impl</description>
    <dependencies>
        <dependency>
            <groupId>mine</groupId>
            <artifactId>my-api</artifactId>
            <version>${product.version}</version>
        </dependency>
    </dependencies>
</project>

【问题讨论】:

  • 请显示 pom 文件。
  • @khmarbaise 请检查我的更新。
  • 根据给定的警告,我会假设您的 pom 中有错误的版本?我希望您不要尝试在您的父条目中使用${project.version} 吗?您使用的是什么发布版本而不是 SNAPSHOT?最好是拥有导致警告的模块的真实 pom 文件。
  • @khmarbaise 使用名为project.version 的已定义属性有什么问题?我还能如何集中产品组件的版本?
  • 这不会像你那样在 Maven 中工作吗?我只是在谈论像这样使用占位符&lt;version&gt;${product.version}&lt;/version&gt;。你是如何调用你的 Maven 构建的?除此之外,如果这可能的话,您的构建如何以任何方式重现。如果您使用 maven-release-plugin 最佳选择,或者有时使用 versions-maven-plugin 来帮助处理父级等中的版本号。

标签: maven maven-2 dependencies packaging


【解决方案1】:

正如你现在所拥有的,你的“打包器”POM 既是一个聚合器(因为它有模块)又是一个父级(因为所有模块都在它们的&lt;parent&gt; 元素中引用它)。因此,“打包器”POM必须有一个明确的版本,你不能使用 ${project.version} 占位符。

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>mine</groupId>
    <artifactId>my-webapp-packager</artifactId>
    <version>0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>Webapp Packager</name>
    <description>Webapp Packager</description>
    <modules>
        <module>my-webapp</module>
        <module>my-api</module>
        <module>my-impl</module>
    </modules>
</project>

在子模块中,&lt;parent&gt; 元素将如下所示:

<parent>
    <groupId>mine</groupId>
    <artifactId>my-webapp-packager</artifactId>
    <version>0.1-SNAPSHOT</version>
</parent>

那么,mvn clean install 应该可以工作了。

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2012-03-29
    • 2014-02-04
    相关资源
    最近更新 更多