使用 Maven 构建 EAR 文件时如何使 "skinnyWar" 选项起作用?

How do I make the "skinnyWar" option work when building an EAR file using Maven?

我正在使用 Maven 3.3.9。我正在创建一个 EAR 项目并在我的 POM 中指定了它 ...

    <packaging>ear</packaging>

我想使用 "skinnyWars" 选项,因此打包在我的 EAR 中的 WAR 文件引用了 EAR 中的一组库,而不是每个库都有自己的副本罐。因此,例如,在我的依赖项部分,我有类似

的内容
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${version.mysql}</version>
    </dependency>

我设置了以下 maven-ear-plugin 配置

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.10.1</version>
            <configuration>
                <finalName>${project.artifactId}</finalName>
                <version>5</version>
                <generatedDescriptorLocation>${basedir}/src/main/application/META-INF</generatedDescriptorLocation>
                <configuration>
                    <defaultLibBundleDir>lib/</defaultLibBundleDir>
                    <skinnyWars>true</skinnyWars>
                </configuration>
                <modules>
                    <webModule>
                        <groupId>org.mainco.subco</groupId>
                        <artifactId>moduleA</artifactId>
                        <uri>moduleA.war</uri>
                        <bundleFileName>moduleA.war</bundleFileName>
                        <contextRoot>/moduleA</contextRoot>
                    </webModule>
                    <webModule>
                        <groupId>org.mainco.subco</groupId>
                        <artifactId>moduleC</artifactId>
                        <uri>moduleC.war</uri>
                        <bundleFileName>moduleC.war</bundleFileName>
                        <contextRoot>/moduleC</contextRoot>
                    </webModule>
                    <webModule>
                        <groupId>org.mainco.subco</groupId>
                        <artifactId>moduleB</artifactId>
                        <uri>moduleB.war</uri>
                        <bundleFileName>moduleB.war</bundleFileName>
                        <contextRoot>/moduleB</contextRoot>
                    </webModule>
                    <webModule>
                        <groupId>org.mainco.subco</groupId>
                        <artifactId>moduleD</artifactId>
                        <uri>moduleD.war</uri>
                        <bundleFileName>moduleD.war</bundleFileName>
                        <contextRoot>/moduleD</contextRoot>
                    </webModule>
                </modules>
            </configuration>
        </plugin>

但是当我运行

mvn clean install

虽然我在输出中看到类似

的行
[INFO] Copying artifact [jar:mysql:mysql-connector-java:5.1.22] to [mysql-connector-java-5.1.22.jar]

共享 JAR 文件 "mysql-connector-java-5.1.22.jar" 位于 EAR 的根目录中,而不是在我的配置中指定的 "lib" 目录中。事实上,根本没有创建 "lib" 目录。更糟糕的是,打包在 EAR 中的 WAR 文件仍然包含我希望它们共享的库的它们自己的副本。为什么我当前的 "skinnyWar" 配置无法正常工作?我需要进行哪些调整才能正常工作?

您应该像这样更改您的配置:

     <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.10.1</version>
        <configuration>
            <finalName>${project.artifactId}</finalName>
            <version>5</version>
            <generatedDescriptorLocation>${basedir}/src/main/application/META-INF</generatedDescriptorLocation>
            <defaultLibBundleDir>lib/</defaultLibBundleDir>
            <skinnyWars>true</skinnyWars>
            <modules>
                <webModule>
                    <groupId>org.mainco.subco</groupId>
                    <artifactId>moduleA</artifactId>
                    <uri>moduleA.war</uri>
                    <bundleFileName>moduleA.war</bundleFileName>
                    <contextRoot>/moduleA</contextRoot>
                </webModule>
                <webModule>
                    <groupId>org.mainco.subco</groupId>
                    <artifactId>moduleC</artifactId>
                    <uri>moduleC.war</uri>
                    <bundleFileName>moduleC.war</bundleFileName>
                    <contextRoot>/moduleC</contextRoot>
                </webModule>
                <webModule>
                    <groupId>org.mainco.subco</groupId>
                    <artifactId>moduleB</artifactId>
                    <uri>moduleB.war</uri>
                    <bundleFileName>moduleB.war</bundleFileName>
                    <contextRoot>/moduleB</contextRoot>
                </webModule>
                <webModule>
                    <groupId>org.mainco.subco</groupId>
                    <artifactId>moduleD</artifactId>
                    <uri>moduleD.war</uri>
                    <bundleFileName>moduleD.war</bundleFileName>
                    <contextRoot>/moduleD</contextRoot>
                </webModule>
            </modules>
        </configuration>
    </plugin>