如何测试从自己的JAR文件中复制文件夹的函数?

时间:2015-05-29 08:28:28

标签: java maven jar resources embedded-resource

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

此功能的一个重要部分是它只知道文件夹名称,而不知道此文件夹中的文件,因此它必须"查询"对他们来说。

问题是,API要查询"对于一个文件夹的所有文件,它们在JAR(生产)或文件系统(测试)上是否有效。

我的问题是:

  • 如何测试在尚未存在的JAR上传递的功能,
  • 或如何"结合"函数(如何决定它是否必须是JAR或非JAR方式),
  • 或(那将是最好的)是否有任何(小型lib)处理这个主题?

用于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中编写了一个multimodul Maven-plugin,它也可以单独使用。

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

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

1 个答案:

答案 0 :(得分:1)

尝试这种方法,

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

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