复制文件时"...Static method get( java.lang.String ) not found in class'java.nio.file.Paths" JMeter Bean



我正在尝试使用JMeter 3.0(Java v1.8)中的Bean Shell Sampler在本地机器(Win 7)上复制和重命名文件。这个想法是创建具有唯一名称的新文件,并将该名称保存为变量,可用于代替 FTP PUT 请求中的文件名。

这是我用于复制和重命名的代码:

import java.text.*;
import java.nio.file.StandardCopyOption.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date())+".xlsx";
log.info(filename);
Path source = Paths.get("C:/dropfile/qatp/QATP_GuestRecords.xlsx");
Path target = Paths.get("C:/dropfile/qatp/"+filename);
Files.copy(source, target, REPLACE_EXISTING);

我在日志中收到的错误:

错误 - jmeter.util.BeanShellInterpreter: 调用 bsh 方法时出错: eval 源文件:内联评估:"导入 java.text。;进口 java.nio.file.StandardCopyOption.;进口 java.io.IO . . .'' : 键入 变量声明:方法调用中的错误:静态方法 get( java.lang.String ) 在类'java.nio.file.Paths' 中找不到

我一直在寻找这个问题的答案,并遇到了一个解决方案,建议是: "我的猜测是,问题在于它没有填充varargs参数。尝试:

Path target = Paths.get(filename, new String[0]);"

我通过修改我的代码来尝试这个解决方案,如下所示:

import java.text.*;
import java.nio.file.StandardCopyOption.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date())+".xlsx";
log.info(filename);
Path source = Paths.get("C:/dropfile/qatp/QATP_GuestRecords.xlsx", new String[0]);
Path target = Paths.get("C:/dropfile/qatp/"+filename, new String[0]);
Files.copy(source, target, REPLACE_EXISTING);

并收到此错误:

错误 - jmeter.util.BeanShellInterpreter: 调用 bsh 方法时出错: eval 源文件:内联评估:"导入 java.text。;进口 java.nio.file.StandardCopyOption.;进口 java.io.IO . . .'' : 键入 变量声明:方法调用路径.get

有谁知道我为什么遇到此错误以及如何解决它?

即使在普通的旧Java中,这也是对Paths.get的误导性使用,它需要一个URI或一个字符串数组(varargs)。参见 javadoc。

在 Java 中,您尝试的内容之所以有效,是因为静态类型允许编译器确定您正在传递单个字符串的数组。显然BeanShell没有并且感到困惑。在我看来,另一个答案中建议的技巧不是一个好技巧:同样在 Java 中,通过连接两个字符串(第二个字符串为空,所以结果是第一个字符串,这是你想要的),但它混淆了 BeanShell,因为还有另一个静态get方法需要 2 个参数。

如果已将路径作为单个字符串,请尝试以下操作:

Path source = new File("C:/dropfile/qatp/QATP_GuestRecords.xlsx").toPath();

或者,您可以使用如下Paths.get

Path source = Paths.get("C:", "dropfile", "qatp", "QATP_GuestRecords.xlsx");

或者像这样(varargs 是帮助传递数组的语法糖):

Path source = Paths.get(new String [] { "C:/dropfile/qatp/QATP_GuestRecords.xlsx" });

将路径片段作为参数传递,或将整个路径字符串作为单个参数传递是完全有效的,但这似乎会触发 BeanShell,因此,最好避免在 BeanShell 中Paths.get,除非您像上一个示例那样显式传递数组。

Beanshell !=Java,它不支持所有的Java功能(把它想象成Java 1.5,并适当地修改你的代码。

所以我建议切换到JSR223 Sampler和Groovy语言,Groovy更符合Java,性能更好。

另外请注意,您可以使用FileUtils.copyFile()方法,该方法适用于Beanshell和/或Groovy

import org.apache.commons.io.FileUtils;
import java.text.SimpleDateFormat;
String filename = new SimpleDateFormat("dd-MM-yyyy_hh:mm:ss").format(new Date()) + ".xlsx";
FileUtils.copyFile(new File("/tmp/QATP_GuestRecords.xlsx"), new File("/tmp/" + filename));

请参阅 Groovy是 New Black 文章,了解有关在 JMeter 测试脚本中使用 Groovy 语言的更多信息。

最新更新