maven:将资源从依赖 jar 复制到目标文件夹
maven: copy resource from dependent jar to target folder
在构建期间执行测试之前,我需要将资源文件 (menu.xml) 从依赖 jar 文件的根目录复制到当前项目的输出目录的根目录。该文件必须可用于测试,但稍后也可用于使用 ...getClassLoader().getResourceAsStream("menu.xml")
.
的主程序
我正在尝试 this question 中建议的解决方案,但它不起作用。
pom 文件如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>resource-dependencies</id>
<phase>process-test-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeArtifactIds>pm1j-jar</includeArtifactIds>
<includes>menu.xml</includes>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
当我执行 mvn clean process-test-resources
时,我看到以下输出:
[INFO] --- maven-resources-plugin:2.7:testResources (default-testResources) @ pm1-config ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-dependency-plugin:2.8:unpack-dependencies (resource-dependencies) @ pm1-config ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.709 s
[INFO] Finished at: 2016-05-05T15:01:06-03:00
[INFO] Final Memory: 30M/458M
[INFO] ------------------------------------------------------------------------
文件menu.xml没有复制到目标文件夹。我怎样才能看到什么可能是错误的?我尝试 运行 调试日志级别的 maven 并且可以看到配置被正确解析,但是插件没有记录正在发生的事情的任何附加信息。
...
[DEBUG] (f) includeArtifactIds = pm1j-jar
[DEBUG] (s) includes = menu.xml
...
[DEBUG] (f) outputAbsoluteArtifactFilename = false
[DEBUG] (s) outputDirectory = c:\Dev\workspaces\config\pm1j\pm1-config\target\classes
...
[DEBUG] (f) project = MavenProject: com.expersoft.pm1j:pm1-config:3-SNAPSHOT @ c:\Dev\workspaces\config\pm1j\pm1-config\
pom.xml
[DEBUG] -- end configuration --
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.014 s
[INFO] Finished at: 2016-05-05T15:09:29-03:00
[INFO] Final Memory: 27M/328M
[INFO] ------------------------------------------------------------------------
在评论的一些帮助下,我可以弄清楚问题所在。 包含 menu.xml 文件的 jar 不在我项目的依赖项列表中。
为了更好地理解,这里有一个更好的解释:
我的项目在一个maven多模块中,我需要这个menu.xml的信息,它在同一个多模块的另一个项目中维护。除了这个文件之外,没有对这个其他项目的其他依赖,因此,也没有对 jar 的 Maven 依赖。
为了避免我项目中的文件重复,到目前为止,我使用 maven-resources-plugin 帮助自己,它从另一个项目的源目录复制文件。不过,我从来都不喜欢这个解决方案,因为它依赖于文件系统上其他项目的源代码。
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/src/main/resources</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/../pm1-jJar/src/main/resources</directory>
<includes>
<include>menu.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
然后 I discovered the maven-depency-plugin 和 unpack 目标可以从存储库中从下载的 jar 中提取文件。这看起来像是一个更简洁的解决方案。我试了一下,效果很好。这个解决方案的问题是,解包插件仅在测试后的稍后 maven 阶段起作用,我也使用该文件进行了一些测试。
经过更多研究,我发现了带有 unpack-dependencies 目标的资源依赖插件,它看起来是完美的解决方案,但在这个阶段我完全忘记了我实际上不依赖于 jar。
为了在测试前使用 maven-dependency-plugin 解压 jar,解决方法是在解压后使用 failsafe 而不是 surefire 进行测试 运行。
西蒙
从依赖项复制文件的一个好方法是使用目标解包:
您可以在
dir/** --> 包含目录中的所有内容
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>resource-dependencies</id>
<phase>compile</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>group_id</groupId>
<artifactId>artifact_id</artifactId>
<version>1.0.0</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
</artifactItem>
</artifactItems>
<includes>directory_to_include/**</includes>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
我将目标解包附加到阶段编译。根据您的需要定制。
在构建期间执行测试之前,我需要将资源文件 (menu.xml) 从依赖 jar 文件的根目录复制到当前项目的输出目录的根目录。该文件必须可用于测试,但稍后也可用于使用 ...getClassLoader().getResourceAsStream("menu.xml")
.
我正在尝试 this question 中建议的解决方案,但它不起作用。
pom 文件如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>resource-dependencies</id>
<phase>process-test-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeArtifactIds>pm1j-jar</includeArtifactIds>
<includes>menu.xml</includes>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
当我执行 mvn clean process-test-resources
时,我看到以下输出:
[INFO] --- maven-resources-plugin:2.7:testResources (default-testResources) @ pm1-config ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO]
[INFO] --- maven-dependency-plugin:2.8:unpack-dependencies (resource-dependencies) @ pm1-config ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.709 s
[INFO] Finished at: 2016-05-05T15:01:06-03:00
[INFO] Final Memory: 30M/458M
[INFO] ------------------------------------------------------------------------
文件menu.xml没有复制到目标文件夹。我怎样才能看到什么可能是错误的?我尝试 运行 调试日志级别的 maven 并且可以看到配置被正确解析,但是插件没有记录正在发生的事情的任何附加信息。
...
[DEBUG] (f) includeArtifactIds = pm1j-jar
[DEBUG] (s) includes = menu.xml
...
[DEBUG] (f) outputAbsoluteArtifactFilename = false
[DEBUG] (s) outputDirectory = c:\Dev\workspaces\config\pm1j\pm1-config\target\classes
...
[DEBUG] (f) project = MavenProject: com.expersoft.pm1j:pm1-config:3-SNAPSHOT @ c:\Dev\workspaces\config\pm1j\pm1-config\
pom.xml
[DEBUG] -- end configuration --
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.014 s
[INFO] Finished at: 2016-05-05T15:09:29-03:00
[INFO] Final Memory: 27M/328M
[INFO] ------------------------------------------------------------------------
在评论的一些帮助下,我可以弄清楚问题所在。 包含 menu.xml 文件的 jar 不在我项目的依赖项列表中。
为了更好地理解,这里有一个更好的解释:
我的项目在一个maven多模块中,我需要这个menu.xml的信息,它在同一个多模块的另一个项目中维护。除了这个文件之外,没有对这个其他项目的其他依赖,因此,也没有对 jar 的 Maven 依赖。
为了避免我项目中的文件重复,到目前为止,我使用 maven-resources-plugin 帮助自己,它从另一个项目的源目录复制文件。不过,我从来都不喜欢这个解决方案,因为它依赖于文件系统上其他项目的源代码。
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/src/main/resources</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/../pm1-jJar/src/main/resources</directory>
<includes>
<include>menu.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
然后 I discovered the maven-depency-plugin 和 unpack 目标可以从存储库中从下载的 jar 中提取文件。这看起来像是一个更简洁的解决方案。我试了一下,效果很好。这个解决方案的问题是,解包插件仅在测试后的稍后 maven 阶段起作用,我也使用该文件进行了一些测试。
经过更多研究,我发现了带有 unpack-dependencies 目标的资源依赖插件,它看起来是完美的解决方案,但在这个阶段我完全忘记了我实际上不依赖于 jar。
为了在测试前使用 maven-dependency-plugin 解压 jar,解决方法是在解压后使用 failsafe 而不是 surefire 进行测试 运行。
西蒙
从依赖项复制文件的一个好方法是使用目标解包:
您可以在 dir/** --> 包含目录中的所有内容
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>resource-dependencies</id>
<phase>compile</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>group_id</groupId>
<artifactId>artifact_id</artifactId>
<version>1.0.0</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}</outputDirectory>
</artifactItem>
</artifactItems>
<includes>directory_to_include/**</includes>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
我将目标解包附加到阶段编译。根据您的需要定制。