【问题标题】:maven: copy resource from dependent jar to target foldermaven:将资源从依赖jar复制到目标文件夹
【发布时间】:2016-05-05 18:14:15
【问题描述】:

在构建期间执行测试之前,我需要将资源文件 (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的根目录下吗?你在依赖项列表中有那个 jar 吗?您是否尝试过文档 maven.apache.org/plugins/maven-dependency-plugin/… 中提到的 **/menu.xml 之类的东西 - 如果您仍然从类路径加载文件,请完全解压它?
  • 为什么需要这样做?你不需要这样做。如果资源位于类路径中 JAR 的根目录中,则它位于类路径的根目录中,因此您“想要”的内容绝对没有任何用途。因此:您真正想做什么?你想解决的真正问题是什么?
  • 是的,文件在依赖jar的根目录下。我现在想通了这个问题。 jar 不在依赖项列表中。混乱开始是因为我首先尝试了插件的 unpack 目标,它从存储库下载 jar,效果很好。但是在这种情况下,我不能使用该文件进行测试,因为它发生在生命周期的后期阶段。我想我将不得不退回到以前的解决方案,即使用 maven-resources-plugin 从另一个项目的源文件夹复制文件。

标签: java maven maven-dependency-plugin


【解决方案1】:

在 cmets 的一些帮助下,我可以找出问题所在。 包含 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-pluginunpack 目标可以从存储库中将文件从下载的 jar 中提取出来。这看起来像一个更清洁的解决方案。我试过了,它确实工作得很好。这个解决方案的问题在于,解包插件仅在测试后的后期 Maven 阶段起作用,而且我也使用该文件进行了一些测试。

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

【讨论】:

  • 深入了解 maven-remote-resources-plugin 正是处理这种情况...
【解决方案2】:

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

您可以在 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>

我将目标解包附加到阶段编译。根据您的需要进行定制。

【讨论】:

  • 如果你只有一个不想解压的“东西”(例如你上传到 maven 的 exe),你可以使用同一个插件的复制目标
【解决方案3】:

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

西蒙

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2015-05-12
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多