使用maven将多个资源目录复制到独立的目标目录
Posted
技术标签:
【中文标题】使用maven将多个资源目录复制到独立的目标目录【英文标题】:Copying multiple resource directories to independent target directories with maven 【发布时间】:2013-10-24 21:50:30 【问题描述】:Maven resources plugin:
这个目标需要你配置要复制的资源,并指定输出目录。
使用 maven 将basedir
中的两个(或更多)外部资源目录复制到构建输出目录(请参阅blah
和uggh
)。
$basedir/
- pom.xml
- blah/
- uggh/
- src/
- main/..
- test/..
- target/
- classes/..
- blah/
- uggh/
例如,给定上面的目录结构,使用 maven 将 blah
和 uggh
复制到目标目录。复制一个或另一个很容易,但是,该插件只接受一个 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>
【讨论】:
这会将blah
和uggh
的所有内容转储到target
,但在我的情况下不会转储目录本身。不完全是我要找的,但感谢您的建议
仅从配置中我并不清楚,我希望它如何表现。在 Maven 文档中,<targetPath>
“相对于目标/类目录”。 maven.apache.org/ref/3.2.2/maven-model/apidocs/org/apache/maven/…
我刚试过这个,它也适用于“maven-war-plugin”
我注意到你不需要设置<outputDirectory>
,如果你为两个不同的目录指定<targetPath>
是不同的【参考方案8】:
阅读您的示例,我认为您不必包含和配置 maven-resource-plugin。
只需将这些资源元素添加到<build><resources/>
-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>
会有一个<include>
或<includes>
标签来告诉文件名
倍数
对于多个文件夹,您需要多个 <execution>
s 和不同的 <id>
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将多个资源目录复制到独立的目标目录的主要内容,如果未能解决你的问题,请参考以下文章
Maven:如何获取在 WEB-INF 中复制的资源的战争包?
linux C++独立程序部署路径问题/opt/yourprogram(项目目部署目录项目部署路径程序部署位置项目部署位置)