繁体   English   中英

复制文件时,JMeter Bean Shell采样器错误“在类'java.nio.file.Paths中找不到静态方法get(java.lang.String)”

[英]JMeter Bean Shell Sampler error “…Static method get( java.lang.String ) not found in class'java.nio.file.Paths” when copying files

我正在尝试使用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。 '':类型变量声明:方法调用中的错误:类'java.nio.file.Paths'中找不到静态方法get(java.lang.String)

我一直在寻找这个问题的答案,并遇到了一个建议为 :“我的猜测是,问题在于它没有填充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。 '':类型变量声明:方法调用Paths.get

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

即使在普通的Java中,这也会误导使用Paths.get ,后者使用URI或字符串数​​组(变量)。 参见javadoc

在Java中,您尝试的方法行之有效,因为静态类型允许编译器确定您正在传递单个String的数组。 显然,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" });

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

Beanshell!= Java ,它不支持所有Java功能(考虑一下Java 1.5并适当修改代码。

因此,我建议切换到JSR223 SamplerGroovy语言,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));

有关在JMeter测试脚本中使用Groovy语言的更多信息,请参见Groovy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM