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

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

费锋
2023-03-14

我有一个有4个子项目的maven项目,让我们假设下面的结构:

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

三个webapp子项目依赖于核心子项目。所以poms是这样的:

Main(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>
<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应用程序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>
  <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包”并部署生成的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,但我不知道为什么,因为maven在单独的war文件中放置了最近创建的core.jar。

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

共有1个答案

邢硕
2023-03-14

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

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

mvn clean install

而不是

mvn package
 类似资料:
  • 我已经使用VsCode从Java项目中创建了一个Jar文件,并且在我的pc中工作得很好。 我试着用一台没有Java的笔记本电脑来运行这样的Jar;所以我刚刚下载并安装了最新版本的JRE(https://www.java.com/es/download/ie_manual.jsp)因为这是运行的唯一要求。罐子 但是,当我尝试在这个Separate笔记本电脑中运行Jar时,我收到一条毫无意义的错误消息

  • 和用户余额相关的信息,余额单位都是按照 CNY 的「分」作为单位。 接口不给现实数字,而是给出以 CNY 的「分」单位的数字,并在「启动者」中提供了显示转换比例,单位为百分比(%) 钱包信息 钱包信息提供进入钱包页面所需的附加信息记录接口。 在未来开发中,一些信息可能会被移动到「启动者」中。 GET /wallet 响应 Status: 200 OK { "labels":[ // 充值选

  • 问题内容: 我刚刚将软件包的新版本上传到PyPi(1.2.1.0-r4):我可以下载egg文件并使用easy_install进行安装,并且该版本可以正确检出。但是,当我尝试使用pip进行安装时,它将安装版本1.1.0.0。即使我明确指定要使用的版本,也会收到以下消息:,但我不明白为什么。 我仔细检查并确认1.2.1上的版本字符串大于1.1.0上的版本字符串,如下所示: 那么,为什么要选择安装1.1

  • 我有一个由3个模块组成的分级项目: (无依赖项) (依赖于) (取决于两个模块)

  • 本文向大家介绍java项目jar包与jdk的版本不兼容的问题解决,包括了java项目jar包与jdk的版本不兼容的问题解决的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了java项目jar包与jdk的版本不兼容的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在我们搭建框架或者引入jar包是,总是会因为版本不统一导致版本兼容问

  • 我试图在我的“Java”gradle项目中包含一个本地jar文件。我已经在Project的“main/resource”文件夹中添加了jar文件。在Build.Gradle中添加了以下行:-