【问题标题】:Maven multi module: error assembling WAR: webxml attribute is requiredMaven多模块:组装WAR时出错:需要webxml属性
【发布时间】:2014-10-29 18:08:07
【问题描述】:

我正在将单个 Eclipse Maven 管理的 webapp 项目转换为一个多模块 Maven 项目(这是一个测试 Maven 的测试项目,因此请随时提供任何建议)。

单个项目 webapp 没有任何错误,成功编译并在部署时行为正确,所以我从一个工作应用程序开始。

该应用程序有一个 Web 部件和一个控制台部件,这意味着有一些具有 main() 方法的类在从 Eclipse 中运行时(使用 Run as -> Java Application)按预期工作。这两部分都显示来自数据库的数据,直接通过 JDBC 或通过 jOOQ 查询。

所以,这就是我拆分项目的方式:

  • 核心(包含其他两个部分共有的所有内容);
  • 可运行(包含具有main() 方法的类);
  • webapp(网络应用程序部分)。

在 Eclipse 中,我现在有 4 个独立的项目:

  • shaker-multi 包含聚合器(和父)POM,以及子目录中的每个模块;
  • shaker-multi-core;
  • shaker-multi-runnable;
  • shaker-multi-webapp

在Eclipse内部,corewebapp编译,后者可以部署到Tomcat实例中,我可以在浏览器中看到。

runnable 出现问题。该项目依赖于 jOOQ 类,因此必须生成相关的源代码。 jOOQ 依赖项和配置在core/pom.xml 中(因为它们也可能在那里使用)。

当我执行项目时 -> 运行方式 -> Maven 构建... -> clean generate-sources, 在 shaker-multi-core 我得到:

无法解析的父 POM:找不到 sunshine.web:shaker-multi:pom:0.0.1

这听起来很合理,因为我没有安装任何这些工件,即使在我的本地存储库中也是如此。

但是当我在shaker-multi 上调用 Maven build... -> 'clean install' 时,它会中断,因为它找不到shaker-multi-webappweb.xml 文件(尽管它正确驻留在shaker-multi-webapp/src/main/webapp/WEB-INF/web.xml 中) .

我该怎么办? 我的项目配置/拆分完全错误吗? 我应该用父 POM 添加另一个模块吗?这听起来是错误的,因为 POM 参考声明:

继承和聚合创建了一个很好的动态来通过单个高级 POM 控制构建。 您经常会看到既是父项又是聚合者的项目

我完全迷路了。

我的期望:

  • shaker-multi-webapp 上运行Maven package 并获得可部署的war
  • shaker-multi-runnable 上运行Maven package 并获得一个可运行的命令行jar(我仍然需要配置它的POM 来生成一个带有依赖关系的jar,不过,我知道);李>
  • shaker-multi 上运行Maven package 并获得某种我可以移动的bundle,其中包含warjar每个模块的 em>。

编辑

我加了

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
            <webXml>src/main/webapp/WEB-INF/web.xml</webXml>        
            </configuration>
        </plugin>

shaker-multi-webapp POM,如this answer 所示,但没有区别。


EDIT-2

我清除了整个本地存储库(如建议的 here),当我重新打开 Eclipse 时,我在 Maven 控制台中看到了

[...] 05/09/14 07:58:19 CEST:[INFO] 添加源文件夹 /shaker-multi-webapp/src/main/java 05/09/14 07:58:19 CEST:[INFO] 添加源文件夹 /shaker-multi-webapp/src/test/java **05/09/14 07:58:19 CEST:[错误] 无法读取 web.xml** [...]

有什么提示吗?它从哪里来?我无法重现它(无需再次删除我的整个本地仓库)。


这是shaker-multiPOM:

<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>sunshine.web</groupId>
    <artifactId>shaker-multi</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>

    <modules>
        <module>shaker-multi-core</module>
        <module>shaker-multi-runnable</module>
        <module>shaker-multi-webapp</module>
    </modules>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

这是shaker-multi-corePOM:

<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>sunshine.web</groupId>
        <artifactId>shaker-multi</artifactId>
        <version>0.0.1</version>
    </parent>

    <artifactId>shaker-multi-core</artifactId>
    <packaging>jar</packaging>

    <build>
        <plugins>
            <plugin><!-- jOOQ plugin--></plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency><!-- jOOQ dependency --></dependency>
    </dependencies>

</project>

这是shaker-multi-webappPOM:

<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>sunshine.web</groupId>
        <artifactId>shaker-multi</artifactId>
        <version>0.0.1</version>
    </parent>

    <artifactId>shaker-multi-webapp</artifactId>
    <packaging>war</packaging>

    <build>
        <plugins>
            <plugin><!-- Tomcat local -->
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>sunshine.web</groupId>
            <artifactId>shaker-multi-core</artifactId>
            <version>0.0.1</version>
        </dependency>


        <dependency>
            <!-- JSP & Servlet dependencies -->
        </dependency>

    </dependencies> 
</project>

【问题讨论】:

    标签: java eclipse maven maven-3 multi-module


    【解决方案1】:

    我假设你的文件夹结构是这样的:

     +-- shaker-multi
             +--- pom.xml
             +--- shaker-multi-core
                         +-- pom.xml
             +--- shaker-multi-runnable
                         +-- pom.xml
             +--- shaker-multi-webapp
                         +-- pom.xml
    
    1. 此外,您应该检查您的项目是否在命令和 NOT 在 Eclipse 中。所以你应该去你项目的根目录 (shaker-multi 文件夹) 和

      mvn 清洁包

      这应该不会产生错误等。

    2. 我想到的一件事是为什么要使用发布版本而不是 您项目的快照版本。所以0.0.1而不是0.0.1-SNAPSHOT

    3. 你应该改进的是maven-compiler插件的定义 在你的父母中:

        <build>
             <plugins>
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-compiler-plugin</artifactId>
                     <version>3.1</version>
                     <configuration>
                         <source>1.7</source>
                         <target>1.7</target>
                         <encoding>UTF-8</encoding>
                     </configuration>
                 </plugin>
             </plugins>
         </build>
    

    我建议这样做:

       <build>
         <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
          </pluginManagement>
        </build>
    
    1. 编码可以更好的解决just define the following in your pom:
    <project>
      ...
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
      ...
    </project>
    

    上面将定义许多插件的默认值,如 maven-compiler-plugin, maven-resources-plugin 等

    1. 部分原因在于您的结构看起来不错...我会做一点小改进 建议是如果您定义模块之间的依赖关系:
      <dependencies>
            <dependency>
                <groupId>sunshine.web</groupId>
                <artifactId>shaker-multi-core</artifactId>
                <version>0.0.1</version>
            </dependency>
    
    
            <dependency>
                <!-- JSP & Servlet dependencies -->
            </dependency>
    
        </dependencies> 
    

    我建议像这样定义模块间依赖关系:

      <dependencies>
            <dependency>
                <groupId>sunshine.web</groupId>
                <artifactId>shaker-multi-core</artifactId>
                <version>${project.version}</version>
            </dependency>
    
    
            <dependency>
                <!-- JSP & Servlet dependencies -->
            </dependency>
    
        </dependencies> 
    

    【讨论】:

    • 您介意在您的问题/建议中添加数字或字母引用,以便我可以在评论中引用它们吗?
    • 1) 感谢您的建议; 2) 无特殊原因;我对 Maven 学习采取了缓慢的方法; 3)、4) 和 5) 很好!除此之外,我的设置并没有什么问题,问题是shaker-multi 包含了 aggregator-parent-POM 旁边的所有模块源,而在我的 Eclipse 工作区中,每个子模块都有一个单独的项目。但是我对单个项目进行了更改,但没有将它们提交到 svn 并将它们重新放入聚合器项目中,因此后者的 mvn install 失败了,因为确实没有 web.xml 文件。
    • 为了清楚起见,我将更新我的问题,并尽快添加带有技术解释的答案。但是您的回答包含了宝贵的建议,因此确实值得 +1!
    【解决方案2】:

    这里的整个问题真的很简单,我对此感到有些羞耻:但作为我第一次做一个多模块项目,我想这可能会发生。

    当然,当您自己处理所有项目和模块源时,这里的细节仍然适用:如果您在一个团队中,只处理项目的一部分和/或使用集中的私有存储库,那么 YMMV .

    首先,在我将单个项目拆分为多个模块后,我的 Eclipse Project Explorer 中出现了这种情况:

    +-- shaker-multi
            ^--- pom.xml
            ^--- shaker-multi-core
                        ^-- pom.xml
                        ^-- (other content)
            ^--- shaker-multi-runnable
                        ^-- pom.xml
                        ^-- (other content)
            ^--- shaker-multi-webapp
                        ^-- pom.xml
                        ^-- (other content)
    
    +-- shaker-multi-core
                ^-- pom.xml
    
    +-- shaker-multi-runnable
                ^-- pom.xml
    
    +-- shaker-multi-webapp
                ^-- pom.xml
    

    每个+-- 都是一个独立的Eclipse 项目。它们中的每一个都已从 SVN 中单独签出(因此它们实际上是彼此分离的)。
    然后,我在 +-- shaker-multi-runnable 中编辑了一些东西,并期望当我在 +-- shaker-multi 上运行 Maven 时它能够工作,而无需 svn–提交前者和 svn–更新后者。

    这就是为什么我一直收到这个问题的错误!

    如果这些项目来自最初的单一项目,则处理此类项目的正确方法是:

    • 将代码、资源等拆分到子文件夹中;
    • 将每次更改提交到存储库;
    • 在 Eclipse 中擦除所有涉及的项目

    接下来,您进入 IDE 的 SVN Repositories 选项卡,使用现在拆分的项目展开存储库,然后对父项目(具有模块的项目)Check out as Maven project作为子文件夹)。
    如果您像我一样使用最新版本的 Subclipse,您将需要 Maven Eclipse (m2e) SCM connector for subclipse 1.10 (svn 1.8) - update site(感谢 buluschek development,请参阅该帖子中的最后一个 cmets),以便您可以从作为 Maven 项目签出对话框。

    使用它,您告诉 Eclipse 从父文件夹中检出整个项目,然后 Eclipse 会自动:

    1. 获取所有 Maven 项目模块;
    2. 创建与父项目对应的项目,其中模块是子文件夹;
    3. 为每个模块创建一个单独的项目
    4. 将每个模块项目与父项目链接在一起,以便模块源代码、资源、POM 等中的每次编辑都会立即反映在父项目的文件夹中。

    这点(4)是这里的关键:虽然有几个项目,但它们已经链接在一起了(我想手动签出每个模块文件夹时也可以这样做,虽然我不知道如何)。

    完成此操作后,我所有的 Maven 问题都消失了。

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 2011-07-18
      • 2016-01-28
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2015-11-26
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多