当前位置: 首页 > 知识库问答 >
问题:

Maven多模块:错误组装WAR: webxml属性是必需的

柯乐童
2023-03-14

我正在将一个Eclipse Maven管理的webapp项目转变为一个多模块Maven项目(这是一个用Maven进行实验的测试项目,因此可以随意提供任何种类的建议)。

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

该应用程序有一个web部件和一个控制台部件,这意味着有些类具有<code>main()

所以,这就是我如何拆分项目:

  • 核心(包含其他两个部分的所有共同点)
  • runnable(包含具有<code>main()</code>方法的类)
  • webapp(web应用程序部分)

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

  • shaker-multi包含聚合器(和父)POM,以及子目录中的每个模块;
  • 振动器-多核
  • shaker-多运行n able
  • shaker-多Web应用程序

在Eclipse内部,核心和webapp可以编译,后者可以部署到Tomcat实例,我可以在浏览器中看到它。

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

当我做项目时-

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

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

但当我调用Maven构建时-

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

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

我在这里完全迷失了。

我的期望:

  • shaker-multi-webapp上运行Maven包并获得可部署的战争;
  • shaker-multi-runnable上运行Maven包并获取命令行runnable jar(我仍然需要配置它的POM以生成一个带有依赖项的jar,虽然,我知道);
  • shaker-multi上运行Maven包并获得某种我可以移动的捆绑包,它将包含每个模块的war或jar。

编辑

我补充道

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

到< code > shaker-multi-web app POM,如本答案所示,但没有区别。

编辑-2

我清除了整个本地存储库(按照此处的建议),当我重新打开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**
[...]

有什么提示吗?它是从哪里来的?但我无法复制它(除非再次删除我的整个本地回购协议)。

这是< code>shaker-multi 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>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:

<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>

这是振动筛多 webapp POM:

xml prettyprint-override"><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>

共有2个答案

何雅惠
2023-03-14

这里的整个问题非常简单,我对此感到有点惭愧:但作为我第一次做多模块项目,我想这可能会发生。

当然,当您自己处理所有项目和模块源时,这里的详细信息适用:如果您在团队中,只处理项目的一部分和/或使用集中的私有存储库,则使用YMMV。

首先,在我将单个项目拆分为几个模块之后,我的Eclipse项目浏览器中出现了这种情况:

+-- 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,并期望当我运行Maven时它可以工作 - shaker-multi,没有svn - 提交前者和svn - 更新后者。

这就是为什么我在这个问题上一直出错!

如果这些项目来自一个原本单一的项目,处理这些项目的正确方法是:

    < li >将代码、资源等拆分到子文件夹中; < li >将每个更改提交到存储库; < li >清除Eclipse中的每个相关项目。

接下来,您进入IDE的SVN Repositories选项卡,使用现在拆分的项目扩展存储库,并作为父项目(将模块作为子文件夹的项目)的Maven项目签出。
如果您像我一样使用最新版本的Subclipse,您将需要用于subclipse 1.10(svn 1.8)的Maven Eclipse(m2e)SCM连接器-更新站点(感谢buluschek开发,请参阅该帖子的最后评论),以便您可以从签出为Maven项目对话框中选择存储库路径。

有了它,您告诉Eclipse从父文件夹中签出整个项目,并且Eclipse会自动:

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

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

这样做之后,我所有的Maven问题都消失了。

卫泉
2023-03-14

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

 +-- shaker-multi
         +--- pom.xml
         +--- shaker-multi-core
                     +-- pom.xml
         +--- shaker-multi-runnable
                     +-- pom.xml
         +--- shaker-multi-webapp
                     +-- pom.xml

>

  • 此外,您应该检查您的项目是否在命令上正常工作,而不是在Eclipse中正常工作。因此,您应该转到项目的根目录(摇床多文件夹)并

    mvn清洁包装

    这应该不会产生错误等。

    我想到的一件事是为什么你的项目使用发布版本而不是快照版本。所以< code>0.0.1而不是< code>0.0.1-SNAPSHOT?

    您应该改进的一点是在父级中定义maven编译器插件:

        <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>
    
      < li >编码可以用更好的方法解决,只需在pom中定义以下内容:
    <project>
      ...
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
      ...
    </project>
    

    上面将定义许多插件的默认值,如maven编译器插件、maven资源插件等。

    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> 
    

  •  类似资料:
    • 当我使用: 我得到这个错误: 完整代码: 梯度提升分类器模型为:

    • 问题内容: 在我的Web应用程序中,我对表单字段使用了一些自定义验证。在同一个表单中,我有两个按钮:一个用于实际提交表单,另一个用于取消/重置表单。 通常,我使用Safari作为默认浏览器。现在Safari5退出了,突然我的“取消/重置”按钮不再起作用了。每次按下重置按钮时,表单中的第一个字段都会获得焦点。但是,这与我的自定义表单验证相同。在其他浏览器上尝试时,一切都很好。我必须是Safari 5

    • 我试图创建"CfnUserPoolResourceServer"的认知使用python代码。根据https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_cognito/CfnUserPoolResourceServer.html我试图设置“范围”参数。根据https://docs.aws.amazon.com/AWSCloudFo

    • 我使用要连接到mysql,下面是我的Python语句: 但是有一个错误,这里是日志: 这是我的代码: 我已经创建数据库在谢谢

    • 问题内容: 我正在尝试使用描述的技术在gradle项目中声明。 但是,当我这样做时,会出现此错误: 我怎样才能解决这个问题? 在顶层 build.gradle中 声明为属性的依赖 项 如下: 尝试在 模块级别的build.gradle中 检索依赖 项 (在其中引发错误): 引发错误: 问题答案: 在顶层,包括您的子项目: 在顶层定义ext属性: 如果您仅使用1个值,则不必一定是地图,但是我坚持使用

    • 问题内容: 我知道这已经得到了回答,但是直接执行脚本“ python filename.py”似乎不起作用。我在SuSE Linux上有Python 2.6.2。 码: 命令行: 问题答案: 重组代码,以便在创建Pool实例之前定义函数。否则,工作人员将看不到您的功能。