【问题标题】:What is "pom" packaging in maven?什么是 Maven 中的“pom”包装?
【发布时间】:2011-12-03 06:40:29
【问题描述】:

我得到了一个 maven 项目来编译并部署到一个 tomcat 服务器上。今天之前我从未使用过 maven,但我一直在谷歌上搜索。此项目中的顶级pom.xml 文件似乎将打包类型设置为pom。

在mvn install 之后我应该做什么来部署这个应用程序?我希望能够在某处或某处找到war 文件,但我想我找错了地方或错过了一步。

【问题讨论】:

  • mvn install - 这用于在本地存储库中安装您的工件(jar、war、ear)(通常是 ~/.m2/repository 目录)

标签: java tomcat maven


【解决方案1】:

pom 基本上是一个子模块的容器,每个子模块由与pom.xml 相同目录下的子目录表示,pom 包装。

在某个地方,嵌套在项目结构中,您会发现带有war 包装的工件(模块)。 Maven 通常将所有内容构建到每个模块的/target 子目录中。因此,在mvn install 之后,查看带有war 包装的模块中的target 子目录。

当然:

$ find . -iname "*.war"

效果同样好;-)。

【讨论】:

  • 只是添加一个快速评论,除了“战争”之外,还有其他包装类型可以存在。可以用来代替“war”的一种非常常见的包装类型是“jar”。如果您将此答案中的每个“战争”实例替换为“jar”,您将了解要点。在此处阅读有关包装类型的更多信息:baeldung.com/maven-packaging-types
【解决方案2】:

pom 打包只是一个说明主要工件不是战争或 jar,而是 pom.xml 本身的规范。

它通常与“模块”一起使用,这些模块通常包含在相关项目的子目录中;但是,它也可以用于某些不打算构建主要二进制文件的场景,所有其他重要的工件都被声明为次要工件

考虑一个“文档”项目,主要工件可能是 PDF,但它已经构建,并且可能需要将其声明为辅助工件的工作通过配置告诉 maven 如何构建不'不需要编译。

【讨论】:

  • 我能想到的与 pom 项目类似的其他示例 ==> 抽象类和其中的模块 ==> 具体类。
  • POM 代表项目对象模型。它是 Maven 中的基本工作单元。它是一个 XML 文件,以 pom 形式驻留在项目的基本目录中。
【解决方案3】:

pom 的打包用于聚合其他项目的项目,以及唯一有用的输出是来自某个插件的附加工件的项目。在您的情况下,我猜测您的顶级 pom 包含 <modules>...</modules> 以聚合其他目录,实际输出是其他(可能是子)目录之一的结果。如果为此目的合理编码,它将具有war 的包装。

【讨论】:

  • “唯一有用的输出是来自某个插件的附加工件”是什么意思?
【解决方案4】:

当您执行mvn:install 时,为了简单地回答您的问题,maven 将根据(pom.xml 中的 packaging 属性)创建一个打包的工件,在您运行 maven 安装后,您可以找到扩展名为 .package 的文件

  • 在项目工作区的目标目录中
  • 此外,您的 ma​​ven 2 本地存储库 在您的盒子上搜索 (.m2/respository),您的工件列在 ( 下的 .m2 存储库中groupId/artifactId/artifactId-version.packaging) 目录
  • 如果你在目录下查看,你会发现打包的扩展文件和 pom 扩展(pom 扩展基本上是用来生成这个包的 pom.xml)
  • 如果您的 maven 项目是多模块的,每个模块将包含两个文件,如上所述,除了顶级项目只有一个 pom

【讨论】:

    【解决方案5】:

    将工件打包为 POM 意味着它具有非常简单的生命周期

    package -> install -> deploy
    

    http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

    如果您要部署 pom.xml 文件或不适合其他打包类型的项目,这很有用。

    我们在许多项目中使用 pom 打包,并酌情绑定额外的阶段和目标。

    例如我们的一些应用程序使用:

    prepare-package -> test -> package -> install -> deploy
    

    当您 mvn 安装应用程序时,它应该将其添加到您的本地 .m2 存储库。要在其他地方发布,您需要设置正确的分发管理信息。如果 Maven 没有自动附加工件,您可能还需要使用 maven builder 辅助插件。

    【讨论】:

      【解决方案6】:

      我建议在http://maven.apache.org/guides/getting-started/index.html#How_do_I_build_more_than_one_project_at_once查看经典示例

      这里的 my-webapp 是 web 项目,它依赖于 my-app 项目中的代码。因此,要将两个项目捆绑在一起,我们有顶级 pom.xml,其中提到了最终要捆绑的项目(按照 maven 术语的模块)。这样的顶级 pom.xml 可以使用 pom 打包。

      my-webapp 可以有 war 打包并且可以依赖于 my-app。 my-app 可以有jar包。

      【讨论】:

        【解决方案7】:

        “pom”包装不过是容器,它包含其他包/模块,如 jar、war 和 ear。

        如果您对外部包/容器执行任何操作,例如 mvn clean compile install。然后内部包/模块也得到干净的编译安装。

        无需为每个包/模块执行单独的操作。

        【讨论】:

          【解决方案8】:

          现实生活中的用例

          在一家使用 Java 的公司,我们有一个 python 项目需要进入 Nexus 工件存储库。 Python 并没有真正的二进制文件,所以只是想将 python 文件 .tar 或 .zip 并推送。 repo 已经集成了 maven,因此我们使用 <packaging>pom</packaging> 指示符和 maven assembly plugin 将 python 项目打包为 .zip 并上传。

          SO post 中概述了这些步骤

          【讨论】:

            【解决方案9】:

            https://maven.apache.org/pom.html

            父项目和聚合(多模块)项目所需的打包类型为 pom。这些类型定义了绑定到一组生命周期阶段的目标。例如,如果打包是 jar,那么打包阶段将执行 jar:jar 目标。如果打包是pom,执行的目标是site:attach-descriptor

            【讨论】:

              【解决方案10】:

              POM(Project Object Model) 就是构建项目的自动化脚本,我们可以用 XML 编写自动化脚本, 构建脚本文件在不同的自动化工具中以不同的方式命名

              就像我们在 ANT 中调用 build.xml,在 MAVEN 中调用 pom.xml

              MAVEN 可以打包 jars、wars、ears 和 POM,这对我们所有人来说都是新事物

              如果你想检查WHAT IS POM.XML

              【讨论】:

                猜你喜欢
                • 2021-09-23
                • 1970-01-01
                • 2011-10-27
                • 2015-11-15
                • 1970-01-01
                • 1970-01-01
                • 2012-11-23
                • 2016-01-26
                • 2011-12-23
                相关资源
                最近更新 更多