如何测试从其自己的 JAR 文件中复制文件夹的功能?
How to test a function that copies a folder out of its own JAR file?
我有一个功能(见下文)可以从其自己的 JAR 中复制特定文件夹的所有文件。
对于这个功能(也见下文),我想编写测试,但测试将在 JAR 构建之前执行(它是一个 maven 项目)。
此函数的一个重要部分是它只知道文件夹名称,但不知道该文件夹中的文件,因此必须“查询”它们。
问题是,无论是在 JAR(生产)还是在文件系统(测试)上工作,“查询”一个文件夹中所有文件的 API 都是不同的。
我的问题是:
- 如何测试中继在尚未存在的 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 在不同的模块中。
现在我需要将资源中的特定文件夹从我的项目复制到每个 运行.
中的不同文件夹中
P.S.
通过 getResourcesAsStream 从资源中复制每个文件不是一种选择。
试试这个方法,
将您的 Maven 构建为两部分
第一部分排除您要复制文件的文件夹,所以一旦完成这一部分,您的罐子就准备好了
第二部分执行您的复制代码,该代码从 jar 中获取输入并将其移动到指定的不同文件夹。
我有一个功能(见下文)可以从其自己的 JAR 中复制特定文件夹的所有文件。
对于这个功能(也见下文),我想编写测试,但测试将在 JAR 构建之前执行(它是一个 maven 项目)。
此函数的一个重要部分是它只知道文件夹名称,但不知道该文件夹中的文件,因此必须“查询”它们。
问题是,无论是在 JAR(生产)还是在文件系统(测试)上工作,“查询”一个文件夹中所有文件的 API 都是不同的。
我的问题是:
- 如何测试中继在尚未存在的 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 在不同的模块中。
现在我需要将资源中的特定文件夹从我的项目复制到每个 运行.
P.S.
通过 getResourcesAsStream 从资源中复制每个文件不是一种选择。
试试这个方法,
将您的 Maven 构建为两部分 第一部分排除您要复制文件的文件夹,所以一旦完成这一部分,您的罐子就准备好了
第二部分执行您的复制代码,该代码从 jar 中获取输入并将其移动到指定的不同文件夹。