2017-05-26 1 views
0

私のローカルのファイルをコピーして名前を変更しようとしていますJMeter 3.0(Java v1.8)のBean Shell Samplerを使用して、マシン(Win 7)を起動します。アイデアは、一意の名前で新しいファイルを作成し、FTP PUT要求でファイル名の代わりに使用できる変数として名前を保存することです。JMeter Bean Shell Samplerエラー "ファイルをコピーするときに静的メソッドget(java.lang.String)がclass'java.nio.file.Pathsに見つかりません"

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); 

私がログに受けていますエラー:

ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.text.; import java.nio.file.StandardCopyOption.; import java.io.IO . . . '' : Typed variable declaration : Error in method invocation: Static method get( java.lang.String) not found in class'java.nio.file.Paths'

私はこの問題への答えを探してきた。ここ

は、私はコピーのために使用して名前を変更していたコードですsolution where the suggestion was: "私の推測では、問題はそれが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); 

そして、このエラーを受け取った:私はこのエラーを打つとどのようにそれを回避することになっている理由

ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.text.; import java.nio.file.StandardCopyOption.; import java.io.IO . . . '' : Typed variable declaration : Method Invocation Paths.get

誰でも知っていますか?

答えて

2

普通の古いJavaでも、これはURIまたは文字列(varargs)の配列をとるPaths.getの誤った使用です。 See javadoc

Javaでは静的な型指定により、コンパイラは単一のStringの配列を渡していると判断できるため、試行したことが機能します。明らかにBeanShellは混乱しない。もう一つの答えで提案されているトリックは、私の意見では良いことではありません:Javaでは再び2つの文字列を結合することで動作します(2つ目は空で結果は1番目の文字列です)。 BeanShellは同じ2つの引数をとる別の静的なgetメソッドがあるため同じです。

すでに単一のStringとしてパスをお持ちの場合は、代わりにこれを試してみてください。

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

またはこのような(可変引数はsyntaxic砂糖です:

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

また、あなたはこのようなPaths.getを使用することができます配列を渡すのに役立ちます):

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

fragmeを渡すのは完全に有効ですパスのntsを引数として、またはパス文字列全体を1つの引数として扱いますが、これはBeanShellをトリップするように見えるので、最後の例のように明示的に配列を渡さない限り、BeanShellでPaths.getを避ける方が良いでしょう。

0

のBeanShell!= Javaの、それはすべてのJava機能は(Javaの1.5程度としてそれについて考え、適切にあなたのコードを修正サポートしていません。

だから私はJSR223 SamplerGroovy言語、Groovyのへの切り替えをお勧めしますはるかにJava準拠であり、はるかに優れています。

はまた、あなたがJMeterのテストスクリプトでのGroovy言語の使用方法の詳細については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 is the New Black記事の両方のために動作しますFileUtils.copyFile() methodを使用できることに注意してください。

関連する問題