java - 如何测试从其自己的 JAR 文件中复制文件夹的功能?

标签 java maven jar resources embedded-resource

我有一个功能(见下文)可以从其自己的 JAR 中复制特定文件夹的所有文件。
对于这个功能(也见下文),我想编写测试,但测试将在构建 JAR 之前执行(它是一个 maven 项目)。

此函数的一个重要部分是它只知道文件夹名称,但不知道该文件夹中的文件,因此它必须“查询”它们。

问题是,“查询”一个文件夹中所有文件的 API 是不同的,无论它们是在 JAR(生产)上还是在文件系统(测试)上工作。

我的问题是:

  • 如何测试依赖于尚未存在的 JAR 的功能,
  • 或者如何“组合”这些功能(如何决定它必须是 JAR 还是非 JAR 方式),
  • 或者(那将是最好的)有没有处理这个主题的(小库)?

第一种方法用于jar。 (制作)
这是对 Copy directory from a jar file 的一个稍微修改的版本:

public class RessourcesUtil {
  ...

  public static void copyResourcesFromJar((String nameOfResourceDirectory, 
                  File destinationDirectory) throws IOException {

      String jarPath = RessourcesUtil.class.getProtectionDomain().getCodeSource().
                     getLocation().getFile();

      Enumeration<JarEntry> jarEntries = new JarFile(jarPath).entries();
      while (jarEntries.hasMoreElements()) {
          JarEntry fileFromJar = (JarEntry) jarEntries.nextElement();

          if (fileFromJar.getName().startsWith(nameOfJarDirectory)) {
              String plainFileName = fileFromJar.getName().
                 replaceAll(nameOfJarDirectory, "");
            
              File fileToCreate = 
                 new File(destinationDirectory + File.separator + plainFileName);

              if (fileFromJar.isDirectory()) {
                  fileToCreate.mkdir();
                  continue;
              }

              createFile(jarFile.getInputStream(fileFromJar), fileToCreate);
          }
      }
  }

  private static void createFile(InputStream inputStream, 
                   File fileToWrite) throws IOException {

        try (FileOutputStream fos = new FileOutputStream(fileToWrite)) {
          IOUtils.copy(inputStream, fos);
      }
   }
}

其次,如果资源未打包在 jar 中(用于测试):

public class RessourcesUtil {
  public static void copyResourcesFromFileSystem(String nameOfResourceDirectory, 
                  File destinationDirectory) throws IOException {

      String classDir = RessourcesUtil.class.getProtectionDomain().getCodeSource().
                     getLocation().getPath();

      File srcDir = new File(classDir + File.separator + nameOfResourceDirectory);
      FileUtils.copyDirectory(new File(srcDir.getPath()), destinationDirectory);
  }
  ...
}

两者都有效,但仅在打包或未打包的情况下有效。

背景:

对于一个项目,我在 Eclipse 中编写了一个多模块 Maven 插件,它也可以作为一个独立的插件使用。

我的资源与我的主要资源或我的 mojo 在不同的模块中。
现在我需要在每次运行时将资源中的特定文件夹从我的项目复制到不同的文件夹中。

附言
通过 getResourcesAsStream 从资源中复制每个文件不是一种选择。

最佳答案

试试这个方法,

将您的 Maven 构建为两个部分 第一部分排除要复制文件的文件夹,所以一旦完成这一部分,您就可以准备好 jars

第二部分执行您的复制代码,该代码从 jar 中获取输入并将其移动到指定的不同文件夹。

关于java - 如何测试从其自己的 JAR 文件中复制文件夹的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30524786/

相关文章:

java - 在 Jackson 和 @XmlValue 中序列化对象

java - 在脚本中使用 maven 或在末尾添加脚本运行器任务

java - 如何从注释处理器的环境中排除 Maven 依赖项?

java - 导出 jar 时将 Javadoc 添加到 Eclipse 项目

java - 如何将自定义 jar 文件部署到 Maven 中央存储库中以在 pom.xml 中用作依赖项

java - Jar 签名 Java 6 与 Java 8

java - ANTLR4 Java 插件 RegEx 用于重复标记

java - 使用泛型类型中的 super 将 Map 流式传输到 Consumer 后使用 orElse 编译错误

java - 如何使用非静态方法?

maven - 如何让文件操作在 Jenkins 工作?