Maven多模块:错误组装WAR:需要webxml属性

时间:2014-09-04 20:54:49

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

我正在一个多模块Maven项目中转换一个Eclipse Maven管理的webapp项目(这是一个试验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内部,核心 webapp 编译,后者可以部署到Tomcat实例,我可以在浏览器中看到它。

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

当我做项目时 - >运行方式 - > Maven build ... - > clean generate-sourcesshaker-multi-core我得到:

Non-resolvable parent POM: Failure to find sunshine.web:shaker-multi:pom:0.0.1

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

但是当我打电话给Maven时...... - > shaker-multi上的“干净安装”,因为无法找到web.xml的{​​{1}}文件而中断(虽然它正确位于shaker-multi-webapp中)。

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

  

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

我完全迷失在这里。

我的期望:

  • shaker-multi-webapp/src/main/webapp/WEB-INF/web.xml上运行Maven package并获得可部署的战争;
  • shaker-multi-webapp上运行Maven package并获取命令行runnable jar (我仍然需要配置其POM以生成jar-with-dependencies,但我知道);
  • shaker-multi-runnable上运行Maven package并获取某种捆绑,我可以随身携带,它将包含 war jar 每个模块。

修改

我添加了

shaker-multi

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webXml>src/main/webapp/WEB-INF/web.xml</webXml> </configuration> </plugin> POM,如this answer所示,但没有区别。


修改-2

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

[...]
05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/main/java
05/09/14 07:58:19 CEST: [INFO] Adding source folder /shaker-multi-webapp/src/test/java
**05/09/14 07:58:19 CEST: [ERROR] Could not read web.xml**
[...]

任何提示?它来自哪里?我不能重现它(不再删除我的整个本地回购)。


这是shaker-multi-webapp POM:

shaker-multi

这是<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> POM:

shaker-multi-core

这是<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> POM:

shaker-multi-webapp

2 个答案:

答案 0 :(得分:2)

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

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

    mvn clean package

    这不会产生任何错误等。

  2. 我想到的一件事是你为什么要使用发行版而不是 适合您项目的SNAPSHOT版本。那么0.0.1代替0.0.1-SNAPSHOT

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

  4.  
        <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
    2.  
      <project>
        ...
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        ...
      </project>
      

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

      1. 部分原因是你的结构看起来不错......我会做一个小改进 建议是否定义模块之间的依赖关系:
      2.  
          <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 :(得分:0)

这里的整个问题非常简单,我觉得有点惭愧:但是我第一次做多模块项目时,我想这可能会发生。

当然,当您自己使用所有项目和模块资源时,此处的详细信息仍然存在:如果您是团队成员,仅处理项目的一部分和/或使用集中式私有存储库,然后是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选项卡,使用现在拆分的项目展开存储库,然后执行父项目的签出为Maven项目(将模块作为子文件夹) 如果您和我一样使用最新版本的Subclipse,那么您需要Maven Eclipse (m2e) SCM connector for subclipse 1.10 (svn 1.8) - update site(感谢转到buluschek development,查看该帖子的最新评论),以便您可以从签出Maven项目对话框中选择存储库路径。

有了它,你告诉Eclipse从父文件夹和Eclipse自动检出整个项目:

  1. 获取所有Maven项目模块;
  2. 创建一个与父项目相对应的项目,其中模块是子文件夹;
  3. 为每个单独的模块创建一个单独的项目
  4. 将每个模块项目与父项目链接在一起,这样模块源代码,资源,POM等中的每个编辑都会立即反映在父项目的文件夹中。
  5. 这一点(4)是关键所在:虽然有几个项目,但是它们已经链接在一起(我想在手动检出每个模块文件夹时也可以这样做,虽然我不知道如何)。

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