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

时间:2015-08-28 09:33:27

标签: java maven jar war ear

我有一个包含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>

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

网络应用程序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&#39;”的几个月里,一切都运转良好。在项目的根文件夹中,部署正在生成​​的战争。

但是现在我想部署一个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>

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

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

1 个答案:

答案 0 :(得分:2)

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

您应该使用以下命令

在本地存储库中安装jar库
mvn clean install

而不是

mvn package

仅生成工件