为什么 Maven ear 包使用项目的旧 jar 版本,尽管 war 个子项目包含最新的 jar 版本?

Why Maven ear package uses project's old jar version despite war subprojects contains latest jar version?

我有一个包含 4 个子项目的 Maven 项目,假设结构如下:

  Main 
   |- core (jar)
   |- webapp1 (war)
   |- webapp2 (war)
   |- webapp3 (war)

三个webapp子项目依赖core子项目。所以 poms 就像:

主要(pom.xml):

<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>myGroup</groupId>
  <artifactId>MyArtifact</artifactId>
  <version>1.0</version>
  <packaging>pom</packaging>

  <properties>
  </properties>

  <repositories>
  </repositories>

  <modules>
    <module>core</module>
    <module>webapp1</module>
    <module>webapp2</module>
    <module>webapp3</module>
  </modules> 
   ...
</project>

核心 (pom.xml):

<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>
  <artifactId>core</artifactId>
  <packaging>jar</packaging>
  <parent>
    <groupId>MyGroup</groupId>
    <artifactId>MyArtifact</artifactId>
    <version>1.0</version>
  </parent>
...
</project>

Web 应用程序 poms 是这样的:

<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>
  <artifactId>webapp1</artifactId>
  <version>1.1.0-A1</version>
  <packaging>war</packaging>
  <parent>
    <groupId>MyGroup</groupId>
    <artifactId>MyArtifact</artifactId>
    <version>1.0</version>
  </parent>
<dependencies>
  <dependency>
    <groupId>MyGroup</groupId>
    <artifactId>core</artifactId>
    <version>1.0</version>
  </dependency>
 </dependencies>
  ...
</project>

当我在项目的根文件夹上执行 'mvn package' 并部署正在生成​​的 war 的几个月里一切正常。

但现在我想部署一个 Ear 而不是单独的 War 文件,所以我添加了一个名为 earproject 的子项目。与以下 pom.xml:

<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>
  <artifactId>earproject</artifactId>
  <packaging>ear</packaging>
  <parent>
    <groupId>MyGroup</groupId>
    <artifactId>MyArtifact</artifactId>
    <version>1.0</version>
  </parent>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-ear-plugin</artifactId>
          <version>2.10.1</version>
          <configuration>
              <finalName>EarName</finalName>
              <version>5</version>
              <generatedDescriptorLocation>${basedir}/src/main/applicatio/META-INF</generatedDescriptorLocation>
          <modules>
              <webModule>
                  <groupId>MyGroup</groupId>
                  <artifactId>webapp1</artifactId>
                  <bundleFileName>webapp1.war</bundleFileName>
                  <contextRoot>/webapp1</contextRoot>
              </webModule>
              <webModule>
                  <groupId>MyGroup</groupId>
                  <artifactId>webapp2</artifactId>
                  <bundleFileName>webapp2.war</bundleFileName>
                  <contextRoot>/webapp2</contextRoot>
              </webModule>
              <webModule>
                  <groupId>MyGroup</groupId>
                  <artifactId>webapp3</artifactId>
                  <bundleFileName>webapp3.war</bundleFileName>
                  <contextRoot>/webapp3</contextRoot>
              </webModule>
          </modules>
        </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <dependencies>
    <dependency>
      <groupId>MyGroup</groupId>
      <artifactId>core</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>MyGroup</groupId>
      <artifactId>webapp1</artifactId>
      <type>war</type>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>MyGroup</groupId>
      <artifactId>webapp2</artifactId>
      <type>war</type>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>MyGroup</groupId>
      <artifactId>webapp3</artifactId>
      <type>war</type>
      <version>1.0</version>
    </dependency>
  </dependencies>
</project>

当我 运行 'mvn clean' 和 'mvn package' 生成 ear 文件时使用此配置,但 ear 文件中的 war 文件包含无效的旧版本core.jar。 如果我检查 webapp 项目的目标目录,War 文件有正确的 core.jar 版本。似乎 EAR 打包使用了我的 mvn 存储库中的旧版本的 jar,但我不知道为什么,因为在单独的 war 文件中,maven 将最近创建的 core.jar.

为什么会这样?我需要在 earproject 的 pom.xml 上指定更多内容吗?

我觉得你描述的问题很容易解决。从外观上看,Maven ear 插件正在从存储库中获取核心 jar 文件,而不是新编译的文件。我不知道这个插件行为的原因,但我很久以前就发现了这个问题。

您应该使用以下命令在本地存储库中安装您的 jar 库

mvn clean install

而不是

mvn package

只生成工件