使用maven将多个资源目录复制到独立的目标目录

Posted

技术标签:

【中文标题】使用maven将多个资源目录复制到独立的目标目录【英文标题】:Copying multiple resource directories to independent target directories with maven 【发布时间】:2013-10-24 21:50:30 【问题描述】:

Maven resources plugin:

这个目标需要你配置要复制的资源,并指定输出目录。

使用 maven 将basedir 中的两个(或更多)外部资源目录复制到构建输出目录(请参阅blahuggh)。

$basedir/ 
  - pom.xml
  - blah/
  - uggh/
  - src/
    - main/..
    - test/..
  - target/
    - classes/..
    - blah/
    - uggh/

例如,给定上面的目录结构,使用 maven 将 blahuggh 复制到目标目录。复制一个或另一个很容易,但是,该插件只接受一个 outputDirectory。如果您将target 目录和两个目录都指定为资源,则每个目录的内容都会复制到target,而不是目录本身。

插件的额外使用会覆盖最初的。此外,我尝试指定整个 basedir 并且只包括所需的目录。这不会复制任何内容。

这里是一个复制单个目录的例子:

  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>copy-resources</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>$basedir/target/blah</outputDirectory>
          <resources>
            <resource>
                <directory>blah</directory>
                <filtering>true</filtering>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>

【问题讨论】:

【参考方案1】:

这是我找到的更简单的解决方案,它正在工作......

<build>
    <plugins>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <configuration>   
            </configuration>
        </plugin>
    </plugins> 
    <resources>
        <resource>
            <directory>$basedir/src/main/java/org/mc2/mymusic/gui/main/Menu/resources</directory>
            <targetPath>$basedir/target/classes/org/mc2/mymusic/gui/main/Menu/resources</targetPath>
            <filtering>false</filtering>
        </resource>
    </resources>  
</build>

【讨论】:

即使没有过滤部分也对我有用(因为我将它用于纯文件),语法漂亮而简洁【参考方案2】:

如果您想复制更多目录或文件 - 更好的选择:

  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>copy-resources</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <tasks>
            <copy todir="$basedir/target/blah" overwrite="true">
                 <fileset dir="blah"/>
            </copy>
            <copy file="$basedir/target/blah/somefile"
                  todir="../target_webapp_eclaims/WEB-INF" overwrite="true"/>
          </tasks>
        </configuration>
      </execution>
    </executions>
  </plugin>

【讨论】:

【参考方案3】:

Maven 隐藏了所有内容以使其更易于编码。 您可以通过多种方式实现这一目标。

    在资源插件中编辑默认执行。 (最简单) 这也可以使用包含标签或不同的资源来编写 在资源插件中编写不同的执行。 使用 Antrun 插件。 (你不妨用 ant 编写整个构建) Maven 复制重命名插件。 还有许多其他我在这里没有提到的方式......

编辑默认插件--

<resources>
    <resource>
        <directory>$basedir<directory>
        <includes>
            <include>blah</include>
            <include>ughh</include>
        </includes>
    <resource>
<resources>
<plugins>
    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
            <outputDirectory>$basedir/target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

【讨论】:

【参考方案4】:
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <targetPath>$basedir/target</targetPath>
          </resource>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <targetPath>$basedir/target/classes</targetPath>
          </resource>
       </resources>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <nonFilteredFileExtensions>
                    <nonFilteredFileExtension>jks</nonFilteredFileExtension>
                </nonFilteredFileExtensions>
                <executions>
                    <execution>
                        <id>copy-resources-1</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                    </execution>
                </executions>
            </configuration>
        </plugin>
   </plugins>

【讨论】:

【参考方案5】:
    <resources>
        <resource>
              <directory>$basedir/src/scripts</directory>
              <includes>
                  <include>data-octopus.ps1</include>
              </includes>
              <targetPath>$basedir/target/data</targetPath>
        </resource>
        <resource>
              <directory>$basedir/src/scripts</directory>
              <includes>
                  <include>service-octopus.ps1</include>
              </includes>
              <targetPath>$basedir/target/service</targetPath>
        </resource>
    </resources>

    </plugins>
        ...
    </plugins>

【讨论】:

【参考方案6】:

你可以使用蚂蚁风格的模式

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.7</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>$project.build.directory</outputDirectory>
                <resources>
                    <resource>
                        <directory>$basedir</directory>
                        <includes>
                            <include>blah/**</include>
                            <include>uggh/**</include>
                        </includes>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

【参考方案7】:

对我来说,这个在 Maven 3 中运行良好:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <executions>
                <execution>
                    <id>custom-resources</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>$project.build.directory</outputDirectory>
                        <resources>                                        
                            <resource>
                                <targetPath>$basedir/target/blah</targetPath>
                                <directory>blah</directory>
                                <filtering>true</filtering>
                            </resource>             
                            <resource>
                                <targetPath>$basedir/target/uggh</targetPath>
                                <directory>uggh</directory>
                                <filtering>false</filtering>
                            </resource>              
                        <encoding>UTF-8</encoding>
                    </configuration>            
                </execution>
            </executions>
        </plugin>

【讨论】:

这会将blahuggh 的所有内容转储到target,但在我的情况下不会转储目录本身。不完全是我要找的,但感谢您的建议 仅从配置中我并不清楚,我希望它如何表现。在 Maven 文档中,&lt;targetPath&gt;“相对于目标/类目录”。 maven.apache.org/ref/3.2.2/maven-model/apidocs/org/apache/maven/… 我刚试过这个,它也适用于“maven-war-plugin” 我注意到你不需要设置&lt;outputDirectory&gt;,如果你为两个不同的目录指定&lt;targetPath&gt;是不同的【参考方案8】:

阅读您的示例,我认为您不必包含和配置 maven-resource-plugin。 只需将这些资源元素添加到&lt;build&gt;&lt;resources/&gt;-tag。查看http://maven.apache.org/ref/3.1.1/maven-model/maven.html#class_resource您可以使用哪些其他标签。

【讨论】:

你是对的。这只是为了展示一种稍微不那么冗长的方式来使用 maven-resource-plugin。对于这种情况,要在输出目录中保留源文件夹名称。【参考方案9】:

这是文件结束的地方:

<outputDirectory>$basedir/target/blah</outputDirectory>

这是它的复制来源:

<directory>src/main/otherresources</directory>

会有一个&lt;include&gt;&lt;includes&gt; 标签来告诉文件名

倍数

对于多个文件夹,您需要多个 &lt;execution&gt;s 和不同的 &lt;id&gt;s:

  <plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <executions>
      <execution>
        <id>copy-resources-1</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>$basedir/target/blah</outputDirectory>
          <resources>
            <resource>
                <directory>blah</directory>
                <filtering>true</filtering>
            </resource>
          </resources>
        </configuration>
      </execution>
      <execution>
        <id>copy-resources-2</id>
        <phase>validate</phase>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <configuration>
          <outputDirectory>$basedir/target/ughh</outputDirectory>
          <resources>
            <resource>
                <directory>ughh</directory>
                <filtering>true</filtering>
            </resource>
          </resources>
        </configuration>
      </execution>
    </executions>
  </plugin>

【讨论】:

文件系统上的文件夹在哪里? src/main/resources/ughh ? 我正在使用 maven 3.3.3 这还有可能吗? $basedir 是您工作区的根文件夹。它是其中包含 pom.xml 的文件夹。

以上是关于使用maven将多个资源目录复制到独立的目标目录的主要内容,如果未能解决你的问题,请参考以下文章

hdfs 将多个文件复制到同一个目标目录

将特定目录及其内容添加到Universal目标

linux 怎样复制一个目录的所有文件到另一个目录

Maven:如何获取在 WEB-INF 中复制的资源的战争包?

linux C++独立程序部署路径问题/opt/yourprogram(项目目部署目录项目部署路径程序部署位置项目部署位置)

Linux系统怎么复制文件夹下的全部文件到另外文件夹