Maven 如何将依赖项中的特定文件夹复制到 target/classes/myfolder

Maven how to copy a specific folder inside a dependency to target/classes/myfolder

我有依赖:

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>swagger-ui</artifactId>
    <version>2.1.4</version>
</dependency>

内招摇-ui-2.1.4.jar有META-INF/resources/webjars/.
我想将 webjars/ 文件夹复制到 target/classes/myfolder

我已阅读 this question 并执行以下操作:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>install</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <includeGroupIds>org.webjars</includeGroupIds>
                <includeArtifactIds>swagger-ui</includeArtifactIds>
                <outputDirectory>${project.build.directory}/classes/myfolder</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

但是它将 swagger-ui-2.1.4.jar 复制到 outputDirectory,这并不是我所需要的。

问题:有没有可能的解决方案?

您很可能不需要 copy-dependenciesunpack. Check the official example 了解更多详情。

下面的例子:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <phase>install</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>org.webjars</groupId>
                        <artifactId>swagger-ui</artifactId>
                        <version>2.1.4</version>
                        <type>jar</type>
                        <overWrite>false</overWrite>
                        <outputDirectory>${project.build.directory}/classes/myfolder</outputDirectory>
                        <includes>META-INF/resources/**/*.*</includes>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

将在 ${project.build.directory}/classes/myfolder 下复制 META-INF/resources 的内容,基本上是 webjars 文件夹。但是,您还将获得 META-INF/resources 树结构。


为了准确实现您的意图(仅将依赖项的子文件夹内容复制到某个文件夹),您需要使用两个插件:maven-dependency-pluginmaven-resources-plugin,如下所示:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <phase>install</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>org.webjars</groupId>
                        <artifactId>swagger-ui</artifactId>
                        <version>2.1.4</version>
                        <type>jar</type>
                        <overWrite>false</overWrite>
                        <outputDirectory>${project.build.directory}/tmp</outputDirectory>
                        <includes>META-INF/resources/**/*.*</includes>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.1</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>install</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/classes/myfolder</outputDirectory>
                <resources>
                    <resource>
                        <directory>${project.build.directory}/tmp/META-INF/resources</directory>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

maven-dependency-plugin 会将我们想要的目录树复制到 target\tmp 文件夹,然后 maven-resources-plugin 只会将我们想要的子文件夹复制到最终目录。

请注意,这两个插件都将在 install 阶段执行,但它们的声明顺序对于获得最终期望的结果非常重要。