簡體   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