maven:将资源从依赖jar复制到目标文件夹

时间:2016-05-05 18:14:16

标签: java maven maven-dependency-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] ------------------------------------------------------------------------

3 个答案:

答案 0 :(得分:9)

在评论的一些帮助下,我可以找出问题所在。 持有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解压缩目标,可以从存储库中提取下载的jar文件。这看起来像一个更清洁的解决方案。我尝试了它,它确实工作得很好。这个解决方案的问题在于,unpack插件仅在测试之后的后续maven阶段起作用,并且我也使用该文件进行了一些测试。

经过一些研究,我发现资源依赖插件带有 unpack-dependencies 目标,看起来像是完美的解决方案,但在这个阶段我完全忘记了我实际上没有依赖于jar。

答案 1 :(得分:2)

从依赖项复制文件的一种好方法是使用Goal unpack:

您可以在以下位置提及文件/目录 dir / **->包含目录中的所有内容

git branch -D tmp

我将目标解压缩附加到阶段编译中。根据需要进行自定义。

答案 2 :(得分:-1)

为了在测试之前使用maven-depency-plugin解包jar,解决方法是使用failsafe而不是surefire来在解包后运行测试。

西蒙