【问题标题】:Maven 3: Overlay is not a dependency of the projectMaven 3:覆盖不是项目的依赖项
【发布时间】:2023-07-06 14:00:02
【问题描述】:

我正在尝试测试 maven-war-plugin 的覆盖功能。基本上我需要合并两个战争项目。

所以我将战争定义为依赖:

<dependency> 
  <groupId>my.group.id</groupId> 
  <artifactId>my-legacy-war-project</artifactId> 
  <version>${project.version}</version> 
  <type>war</type> 
</dependency>

然后配置叠加层:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <configuration>
    <overlays>
      <overlay>
        <groupId>my.group.id</groupId>
        <artifactId>my-legacy-war-project</artifactId>
        <targetPath>legacy</targetPath>
      </overlay>
    </overlays>
  </configuration>
</plugin>

但是 Maven 构建这个项目失败,抱怨这个依赖:

[ERROR] 未能执行目标 org.apache.maven.plugins:maven-war-plugin:2.3:exploded (default) on 项目 my-project: 覆盖 [id my.group.id:my-legacy-war-project] 是 不是项目的依赖项。 -> [帮助 1]

覆盖应该与 Maven 3.0.5 一起使用?为什么构建抱怨声明的依赖项?

【问题讨论】:

    标签: java maven maven-3 war


    【解决方案1】:

    不知道为什么,但在叠加层中使用 id 而不是 groupIdartifactId 有效:

      <configuration>
        <overlays>
          <overlay>
            <id>my-legacy-war-project</id>
            <targetPath>legacy</targetPath>
          </overlay>
        </overlays>
      </configuration>
    

    【讨论】:

    • 这里一样……太奇怪了。
    • 也许这是相关的:*.com/questions/12298178/…,尤其是这部分:> 为了其他人的利益,我缺少的是依赖项 > 的 必须匹配大会。
    【解决方案2】:

    我遇到了同样的错误,但可能是出于不同的原因,因为您引入了战争依赖项。在我的例子中,我有一个战争依赖作为一个覆盖,一个 jar 依赖作为另一个。构建抱怨jar依赖:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.4:war (default-war) on project overlay: overlay [ id com.mycompany:launcher] is not a dependency of the project.
    

    我通过在我的 jar 叠加层中添加 &lt;type&gt;jar&lt;/type&gt; 元素来修复错误。根据overlay documentationtype 的默认值为war,因此构建正确地抱怨我没有名为launcher 的战争工件。

    这是我的叠加项目的工作 pom:

    <project>
    
    <artifactId>overlay</artifactId>
    <packaging>war</packaging>
    
    <dependencies>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>app</artifactId>
            <type>war</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>launcher</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <overlays>
                            <overlay>
                                <groupId>com.mycompany</groupId>
                                <artifactId>app</artifactId>
                            </overlay>
                            <overlay>
                                <groupId>com.mycompany</groupId>
                                <artifactId>launcher</artifactId>
                                <type>jar</type>  <!-- THIS IS THE FIX -->
                            </overlay>
                        </overlays>
                    </configuration>
            </plugin>
        </plugins>
    </build>
    

    【讨论】:

      【解决方案3】:

      我在使用 maven-war-plugin 2.2 版和滥用重复插件声明时遇到了同样的问题。统一它们并使用Sergio Michels 建议后,现在使用 2.3 版的 maven-war-plugin 可以正常工作。

      更改前:

      <plugin>
                  <artifactId>maven-war-plugin</artifactId>
                  <version>2.0.2</version>
                  <configuration>
                      <dependentWarExcludes>'**/jdbc.properties,**/hibernate.cfg.xml,**/sql-map-config.xml,**/web.xml,WEB-INF/classes/META-INF/**'</dependentWarExcludes>
                  </configuration>
      </plugin>          
      <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-war-plugin</artifactId>
                  <configuration>
                      <warName>my-snapshot</warName>
                      <overlay>
                          <overlay>
                          <id>my-webapp-common</id>
                          <groupId>xyz.mycompany</groupId>
                          <artifactId>my-webapp-common</artifactId>
                          </overlay>
                      </overlays>
                  </configuration>
      </plugin>
      

      应用更改后:

                 <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-war-plugin</artifactId>
                  <version>2.3</version>
                  <configuration>
                      <warName>my-snapshot</warName>
                      <overlays>
                      <overlay>
                          <overlay>
                              <id>my-webapp-common</id>
                              <targetPath>legacy</targetPath>
                          </overlay>
                      </overlays>
                      <dependentWarExcludes>'**/jdbc.properties,**/hibernate.cfg.xml,**/sql-map-config.xml,**/web.xml,WEB-INF/classes/META-INF/**'</dependentWarExcludes>
                </configuration>
              </plugin>
      

      【讨论】:

        【解决方案4】:

        扩展其他答案。问题是让overlay 使用与dependency 相同的id

        使用$ mvn dependency:list 可以显示您需要的ID。例如:

        [INFO] +- com.foo.bar.v2:api:jar:1.0:system 
        [INFO] \- com.foo.bar.v2:main-server:war:1.0:system 
        [INFO] \- com.foo.bar.v2:second-server:war:classes:1.0:system
        

        显示一个罐子和一场战争。注意::jar:war 完全取决于您是否在 dependency 中使用了 &lt;type&gt;war&lt;/type&gt;。同样,:classes(或空)完全取决于您是否在dependency 中使用了&lt;classifier&gt;classes&lt;/classifier&gt;

        您需要将此与&lt;overlay&gt; 保持一致。对于上面列出的com.foo.bar.v2:main-server:war:1.0:system,这将是覆盖条目:

        <overlay>
            <id>com.foo.bar.v2:main-server:war:1.0</id>
            <groupId>com.foo.bar.v2</groupId>
            <artifactId>main-server</artifactId>
        </overlay>
        

        对于com.foo.bar.v2:second-server:war:classes:1.0:system,这将是正确的条目:

        <overlay>
            <id>com.foo.bar.v2:main-server:war:1.0</id>
            <groupId>com.foo.bar.v2</groupId>
            <artifactId>main-server</artifactId>
            <classifier>classes</classifier>
        </overlay>
        

        【讨论】:

        • 这个答案对我有帮助。我将 war 添加到我的依赖项中,错误消失了。