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

How to test a function that copies a folder out of its own JAR file?

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

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

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

我的问题是:


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 在不同的模块中。
现在我需要将资源中的特定文件夹从我的项目复制到每个 运行.

中的不同文件夹中

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

试试这个方法,

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

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