Maven 无法从父 pom 部署

Posted

技术标签:

【中文标题】Maven 无法从父 pom 部署【英文标题】:Maven can't deploy from parent pom 【发布时间】:2014-07-03 23:27:37 【问题描述】:

我刚刚开始使用 Maven 构建应用程序。我的一种方法是构建一个多模块 Web 应用程序。使用 Eclipse 可以很容易地构建这种应用程序。到目前为止一切正常。我失败的地方是部署。我使用 Wildfly 作为我的应用程序服务器,并且表示层的部署运行良好。但是当我想从父项目进行部署时,我收到了这条消息:

Failed to execute goal org.wildfly.plugins:wildfly-maven-plugin:1.0.1.Final:deploy (default-cli) on project build: Error executing FORCE_DEPLOY: C:\Users\*****\Desktop\workspace\mvnexbook-examples-1.0\ch-multi\target\parent-0.8-SNAPSHOT.maven-project (No such file or directory)

这很令人困惑。不是从 .m2/repository 文件夹中先前安装的文件进行部署吗?我的父文件夹中是否需要一个目标目录?

我的父 pom 文件

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.sonatype.mavenbook.multi</groupId>
        <artifactId>simple-parent</artifactId>
        <version>0.8-SNAPSHOT</version>
    </parent>

    <artifactId>simple-webapp</artifactId>
    <packaging>war</packaging>
    <name>Multi Chapter Simple Web Application Project</name>
    <dependencies>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-servlet_2.4_spec</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.sonatype.mavenbook.multi</groupId>
            <artifactId>simple-weather</artifactId>
            <version>$project.version</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>simple-webapp</finalName>
        <plugins>

            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

编辑:我刚用码头试过。工作正常。为什么它不适用于 Wildfly?

EDIT2:我正在使用 sonatype 书中的 simple-parent-project 示例

【问题讨论】:

【参考方案1】:

在父 POM 中,您需要将 &lt;skip&gt;true&lt;/skip&gt; 添加到配置中。然后为您的 WAR POM 将其设置为 false

父 POM

<plugin>
    <groupId>org.wildfly.plugins</groupId>
    <artifactId>wildfly-maven-plugin</artifactId>
    <version>1.0.1.Final</version>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>

战争 POM

<plugin>
    <groupId>org.wildfly.plugins</groupId>
    <artifactId>wildfly-maven-plugin</artifactId>
    <configuration>
        <skip>false</skip>
    </configuration>
</plugin>

【讨论】:

谢谢,skip 完成了这项工作。但我仍然很困惑。首先,为什么我们需要跳过父pom。我认为通过构建父 pom,每个模块都将被自动部署,并且父级将被 wildfly 插件作为聚合器项目处理。第二件事是,为什么任何解决这个话题的网站都没有提到这一点。也许我只是没明白。 这只是插件的编写方式。我们应该将其更改为自动忽略 pom 包类型。 @James R. Perkins 如果我没有 war pom,我需要做什么?子模块被打包成 jars 并由 'maven-war-plugin' 添加到战争中,在父安装期间。如何部署这种战争? 您只需将&lt;skip&gt;true&lt;/skip&gt; 添加到您不想部署的模块中,或者只在您想要部署的模块中指定插件。后者将要求您在执行插件目标时位于该目录中。【参考方案2】:

您的应用程序 EAR 可能不在父项目构建文件夹中。它可能位于 APP 模块构建项目中。如果您查看here:,您会看到,targetDir 默认为当前项目的构建目录。您可以提供另一个值。 filename 参数指向文件名。它默认为 $project.build.finalName.$project.packaging,在您的情况下,它没有有意义的扩展名。

你可能想尝试类似的东西

        <configuration>
            <targetDir>path</targetDir>
            <filename>filename</filename>
        </configuration> 

到您的插件定义。您当然可以使用相对路径。您也可以尝试从 APP 项目中运行您的插件。

【讨论】:

父项目不需要是pom。试图改变它,但 eclipse 说:聚合器项目需要是 pom。只想提一下,我使用的是 sonatype 中的简单父示例。我唯一改变的是我添加的wildfly maven插件。即使我改变了targetDir,我也不知道指向哪里。 是的,这是我的错。你是对的。因此,您可能必须从默认值重新定义文件名。您也可以尝试从您的应用项目运行插件。我会更新我的答案 更改目标目录和文件名没有成功。我仍然遇到同样的错误。为什么它适用于码头而不适用于jboss? “从 APP 项目运行你的插件”是什么意思? 好的,如果没有意义,你应该忽略我的回答。我找不到您使用的确切原型。对我来说,通常会有父项目和子项目之类的东西——一个用于客户端(接口和实体),一个用于实现,一个用于战争,一个用于组装。后者就是我所说的APP。对不起,如果我误导了你。只需确保指向正确的文件即可。 谢谢你至少在尝试。在网上找不到关于该问题的类似内容

以上是关于Maven 无法从父 pom 部署的主要内容,如果未能解决你的问题,请参考以下文章

无法将Spring Boot依赖项从父模块导入子模块

无法从父 pom.xml 解析子 pom.xml 中的 $project.version

如何抑制从父 pom.xml 运行 maven-javadoc-plugin?

无法使用 cargo-maven-plugin 重新部署到远程 tomcat 7

jboss-as-maven-plugin 无法部署到远程 JBoss AS7?

如何从父pom继承依赖到子pom