2016-07-30 71 views
2

我有一个Maven 3.3项目,主要输出是一个WAR文件:Maven项目包装是战争,而且建筑/安装JAR

<artifactId>pro</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>war</packaging> 

我使用maven插件还建立一个jar文件,这进入target/pro-1.0-SNAPSHOT.jar和这个作品。

我想安装这个罐子本地Maven回购,所以我使用的Maven插件安装要做到这一点:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <version>2.5.2</version> 
    <configuration> 
     <classifier>jar</classifier> 
     <packaging>jar</packaging> 
     <file>target/pro-1.0-SNAPSHOT.jar</file> 
    </configuration> 
    <executions> 
     <execution> 
      <id>do-jar-install</id> 
      <phase>install</phase> 
      <goals> 
       <goal>install</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

整个建造工作正常,除了罐安装步骤安装战争,而不是罐子。我如何覆盖这个?

我期待在这里看到,我可以用什么:http://maven.apache.org/plugins/maven-install-plugin/examples/installing-secondary-artifacts.html

这里是我的生成日志:

**

大厦罐子:/用户/麦克风/码/workspace/pro/target/pro-1.0-SNAPSHOT.jar

[INFO] --- Maven的安装,插件:2.5.2:安装(DO-JAR安装)@亲

[INFO]将/Users/mike/code/workspace/pro/target/pro-1.0-SNAPSHOT.jar安装到/Users/mike/.m2/repository/net/mikeski/pro/1.0-SNAPSHOT/pro-1.0 -SNAPSHOT.war

注意最后一行 - 它拿起罐子安装战争

我该如何解决呢?

按照要求,这里是罐子插件配置:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
     <execution> 
      <id>create-jar</id> 
      <phase>install</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

它创造了该项目的文件的罐子,这是正确的罐子。如果我将安装在我的回购库中的war复制到jar(所以我只是更改扩展名),我的其他项目可以很好地捡起它。

回答

3

您当前的输出是多重考虑的结果,其中之一是maven-jar-plugin在版本2.4中也过分宽容。

首先,您需要记住,在Maven仓库中,所有工件共享一个命名约定,即artifactId-version(-classifier).packaging。这意味着无论您的版本生成的文件的本地名称是什么(假设它是foo.jar),它都将被安装,并且将使用该常规名称进行部署。安装工件时的所有问题都是Maven coordinates,即groupId,artifactId,版本,分类器和打包。

这里发生的事情是:

  1. 你的项目有一个包装war。使用mvn install运行Maven,将首先调用default-install阶段,并且首次运行maven-install-plugin:install目标,即安装WAR项目。在你的日志,你会发现:

    [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ test-war --- 
    [INFO] Installing ...\test-war\target\test-war-0.0.1-SNAPSHOT.war to ...\test-war\0.0.1-SNAPSHOT\test-war-0.0.1-SNAPSHOT.war 
    [INFO] Installing ...\test-war\pom.xml to ...\test-war\0.0.1-SNAPSHOT\test-war-0.0.1-SNAPSHOT.pom 
    
  2. 然后,您使用的是maven-jar-plugin:jar目标是建立一个JAR。这个插件为当前的Maven项目创建了一个JAR--所以它会创建它,但这个新工件的Maven坐标将与WAR项目的Maven坐标完全相同(您没有指定classifier)。因此,您通过JAR文件有效地替换了主工件(这是一个WAR)的文件:最终得到一个扩展名为jar的本地文件(因为maven-jar-plugin以这种方式创建了该文件) Maven项目的主要工件包装war。非常混乱。

    请记住,我说过maven-jar-plugin太宽松了吗?如果更新的插件3.0.2版本,你会得到一个错误就在这里(MJAR-198):

    你必须使用一个分类来补充文物重视该项目,而不是取代它们。 - > [Help 1]

    其中总结了上述内容。

  3. 最后,您声明maven-install-plugin的另一个执行,称为do-jar-install,即应该安装此本地JAR文件。这就是它所做的:它使用工件的坐标将本地JAR文件安装到您的本地Maven存储库的target文件夹中。这种混乱来自于一个事实,即工件类型(包装)实际上是战争,那么将安装哪些功能是一个WAR文件(即实际上是JAR)...


现在我们已经解释了这个问题,问题是:你想做什么?它看起来像你想附加到你的WAR项目一个额外的工件组成的类。不需要所有这些配置,只需使用maven-war-pluginattachClasses参数即可。

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
    <attachClasses>true</attachClasses> 
    </configuration> 
</plugin> 
+0

谢谢,我真正需要做的是独立的我的实体和接口,一个单独的Maven的模块,并使用了这两个项目。这是问题的正确答案,但不是解决我的问题的方法。 – mikeb

0

你收到这是因为插件的双重调用:

  1. 执行阶段
  2. 包 - 缺相

如果没有强有力的理由和您所关心的是有只有一个JAR作为项目中的人工产物,使用其中的一个。

类似:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <outputDirectory>${outputDirectory}</outputDirectory> 
     </configuration> 
</plugin>