maven-war-插件忽略<archiveClasses>

maven-war-plugin ignores <archiveClasses>

<archiveClasses> 选项无效。

运行 mvn clean compile war:exploded 生成一个 war 目录,在 classes 目录中包含 .class 文件,并且它们没有归档到 jar 中lib 目录都没有。 war:war 产生相同的结果。

插件配置:

...
<plugin>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.6</version>
  <configuration>
      <archiveClasses>true</archiveClasses>
  </configuration>
</plugin>
...

解决方法?

Maven 版本 3.3.3,maven-war-plugin 版本 2.6.

JIRA 票证 – https://issues.apache.org/jira/browse/MWAR-355

这是有问题的项目:https://bitbucket.org/dmos62/raudondvaris

首先你应该将普通配置移动到 pluginManagement block like this:

 <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.6</version>
          <configuration>
            <archiveClasses>true</archiveClasses>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

如果您执行上述操作,将在 war 存档中创建 类,方法是:mvn clean compile war:war

~/ws-git/so-questions/so-5 (master)$ unzip -t target/web-1.0.0-SNAPSHOT.war
Archive:  target/web-1.0.0-SNAPSHOT.war
    testing: META-INF/                OK
    testing: META-INF/MANIFEST.MF     OK
    testing: WEB-INF/                 OK
    testing: WEB-INF/classes/         OK
    testing: WEB-INF/lib/             OK
    testing: WEB-INF/lib/commons-fileupload-1.1.1.jar   OK
    testing: WEB-INF/lib/commons-io-1.1.jar   OK
    testing: WEB-INF/lib/web-1.0.0-SNAPSHOT.jar   OK
    testing: WEB-INF/web.xml          OK
    testing: META-INF/maven/com.soebes.examples.so/web/pom.xml   OK
    testing: META-INF/maven/com.soebes.examples.so/web/pom.properties   OK
    testing: META-INF/INDEX.LIST      OK
No errors detected in compressed data of target/web-1.0.0-SNAPSHOT.war.

这也适用于您的通话 mvn clean compile war:exploded

   └── web-1.0.0-SNAPSHOT
        ├── META-INF
        └── WEB-INF
            ├── classes
            ├── lib
            │   ├── commons-fileupload-1.1.1.jar
            │   ├── commons-io-1.1.jar
            │   └── web-1.0.0-SNAPSHOT.jar
            └── web.xml

此行为的原因仅仅是因为使用 war:warwar:exploded 之类的目标,因此不会启动生命周期,这意味着不考虑 pom 中的配置。如果你喜欢为你的命令行调用配置你可以通过使用一个特殊的命令行调用配置来做到这一点(id default-cli 是重要的部分):

<project>
  <build>
    <plugins>
      <plugin>
        <groupId...>
        <artifactId...>
        <executions>
          <execution>
            <id>default-cli</id>
            <configuration>
              .....
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

这意味着对命令行调用有一个特殊的配置。从 Maven 3.3.1 开始,可以通过使用它来为命令行调用设置多个配置:

<project...>
  <build>
    <plugins>
      <plugin>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <executions>
          <execution>
            <id>first-cli</id>
            <configuration>
                 ....
            </configuration>
          </execution>
          <execution>
            <id>second-cli</id>
            <configuration>
                 ....
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

maven 可以通过以下方式使用它:

mvn plugin:goal@second-cli
mvn plugin:goal@first-cli

另见 release notes for Maven 3.3.1