gpt4 book ai didi

java - FitNesse 中类路径 (!path) 元素中的空白的正确转义或引用是什么?

转载 作者:行者123 更新时间:2023-12-01 14:24:14 24 4
gpt4 key购买 nike

假设我在 FitNesse 套件中有以下类路径定义:

!*> '''Classpath'''
!path /home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes
!path /home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes
!path /home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar
*!

我尝试了以下形式的引用或转义:

  • 普通空白:!path/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes
  • 反斜杠:!path/home/stewart/white\space\test/example-1.0.0-SNAPSHOT/target/classes
  • 双反斜杠:!path/home/stewart/white\\space\\test/example-1.0.0-SNAPSHOT/target/classes
  • 双引号:!path "/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes"
  • 单引号:!path '/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes'
  • % 编码:!path/home/stewart/white%20space%20test/example-1.0.0-SNAPSHOT/target/classes
  • 使用 +:!path/home/stewart/white+space+test/example-1.0.0-SNAPSHOT/target/classes
  • Unicode 序列:!path/home/stewart/white\u0020space\u0020test/example-1.0.0-SNAPSHOT/target/classes
  • 带有额外反斜杠的 Unicode 序列:!path/home/stewart/white\\u0020space\\u0020test/example-1.0.0-SNAPSHOT/target/classes
  • 通配符:!path/home/stewart/white*space*test/example-1.0.0-SNAPSHOT/target/classes
  • FitNesse wiki 转义:!path !-/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes-!

使用普通空格和一些引用的空格,测试根本不会运行,并且出现错误:

Could not find or load main class space

根据错误日志,FitNesse 正在尝试用引号转义空格。它使用以下命令调用 FitServer:

java -cp fitnesse.jar:"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes":"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar fit.FitServer linux-desktop 9123 10

随着一些转义,测试确实运行,但它们失败了,因为 FitNesse 无法在类路径上找到固定装置,我相信这意味着空白的替代(+、%20、\u0020 等)没有得到解析为空格,但作为路径文字。

我开始认为在 FitNesse 中不可能做到这一点......

<小时/>

更新:我还尝试使用 COMMAND_PATTERNCLASSPATH_PROPERTY FitNesse 变量进行实验,如有关 customizing test execution 的文档中详细介绍。

<小时/>

FitNesse 版本为 20121220。

最佳答案

好的,首先要注意的是,这种现象在 Windows 上不会发生。 FitNesse 自动用双引号将包含空格的类路径元素括起来,正如问题中已经指出的那样。 FitNesse 生成的命令是:

java -cp fitnesse.jar:"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes":"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar fit.FitServer linux-desktop 9123 10

在 Windows 上,这将是:

java -cp fitnesse.jar:"C:\white space test\example-1.0.0-SNAPSHOT\target\test-classes":"C:\white space test\example-1.0.0-SNAPSHOT\target\classes":C:\.m2\repository\org\fitnesse\fitnesse\20121220\fitnesse-20121220.jar fit.FitServer windows-desktop 9123 10

而且它确实有效!

考虑到 Windows 是目录(文件夹)名称中常见空格的操作系统,我本可以就此打住;但我想更深入地研究,因为在类 Unix 系统上的目录名称中偶尔会出现空格(我会想到 MacOS。)

深入研究 FitNesse 源代码,我们感兴趣的类是 fitnesse.testsystems.CommandRunner。在方法 asynchronousStart() 中,它使用 Java 的 Runtime.exec() 方法。

Runtime.exec() 具有重载方法。在某些情况下,命令是一个 String,它由 java.util.StringTokenizer 进行解析。在其他情况下,该命令已经是一个 String[] 并且不会进一步解析。

换句话说,这失败了:

String cmd = "java -cp fitnesse.jar:\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes\":\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes\":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar fit.FitServer linux-desktop 9123 10";
String[] env = new String[]{};
Runtime.getRuntime().exec(cmd, env);

虽然这有效:

String[] cmd = new String[] {
"java",
"-cp",
"fitnesse.jar:\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/test-classes\":\"/home/stewart/white space test/example-1.0.0-SNAPSHOT/target/classes\":/home/stewart/.m2/repository/org/fitnesse/fitnesse/20121220/fitnesse-20121220.jar",
"fit.FitServer",
"linux-desktop",
"9123",
"10";
};
String[] env = new String[]{};
Runtime.getRuntime().exec(cmd, env);

结论:这是 FitNesse 中的一个错误。

<小时/>

更新:FitNesse 版本 20140623 及以上版本已修复此问题。

关于java - FitNesse 中类路径 (!path) 元素中的空白的正确转义或引用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com