1

我使用 Xored 的 F4 IDE for Fantom 开始了一个非常简单的项目。前几次我运行它没有错误,但我开始添加依赖项(fanbatis),并且在某个时候,每次运行测试或虚拟 Hello World 应用程序时都会出现下面的错误。

[23:44:18 22-Nov-13] [err] [pathenv] 无法解析路径:C:\dev\f4workspace\auth\bin\fan
  sys::ArgErr:本地文件的 Uri 方案无效:c:\dev\f4workspace\auth\bin\fan/
    fan.sys.LocalFile.uriToFile (LocalFile.java:64)
    fan.sys.File.make (File.java:26)
    util::PathEnv.parsePath (PathEnv.fan:47)
    fan.sys.List.each (List.java:555)
    util::PathEnv.parsePath (PathEnv.fan:43)
    util::PathEnv.make$ (PathEnv.fan:22)
    util::PathEnv.make (PathEnv.fan:20)
    java.lang.reflect.Method.invoke(未知)
    fan.sys.Method.invoke (Method.java:559)
    fan.sys.Method$MethodFunc.callList (Method.java:198)
    fan.sys.Type.make (Type.java:246)
    fan.sys.ClassType.make (ClassType.java:110)
    fan.sys.Type.make (Type.java:236)
    fan.sys.Sys.initEnv (Sys.java:447)
    风扇系统 (系统.java:224)
    fanx.tools.Fan.execute (Fan.java:28)
    fanx.tools.Fan.run (Fan.java:298)
    fanx.tools.Fan.main (Fan.java:336)
你好世界!

目前这更令人讨厌,因为测试和虚拟应用程序仍在运行。我创建了另一个项目,逐类复制所有源代码并在每次更改后进行测试,并且从未发生错误。请问有什么想法吗?

4

2 回答 2

2

这是一个有趣的问题!

tl/dr:您的工作区中有一个空项目“auth”,可以在其中创建一些虚拟类,或者转到“运行”->“运行配置”,找到您的启动配置并取消选中“项目”选项卡上没有源的项目。

为了使您的 Fantom 安装与工作区中的项目保持清洁,F4 将构建的 pod 放入 project/bin/fan/lib/fan。当 F4 从工作区启动项目时,它使用PathEnv并通过连接到 Fantom 安装路径和工作区项目中的 bin/ 文件夹来构建 FAN_ENV_PATH。

当 Fantom 运行时分析 FAN_ENV_PATH 时,首先它将路径解释为本地 OS 路径,但如果 dir 不存在,它会尝试将其解释为文件 URI,这是 PathEnv 源的相关部分:

path.split(File.pathSep[0]).each |item|
{
  if (item.isEmpty) return
  dir := File.os(item).normalize
  if (!dir.exists) dir = File(item.toUri.plusSlash, false).normalize
  if (!dir.exists) { log.warn("Dir not found: $dir"); return }

问题代码是 item.toUri——在 Mac OS X 和 Linux 上,它被解析为一个没有路径的方案的 URI,所以如果目录不存在,这个代码只会在控制台中打印一个警告。

但在 Windows 上,由于路径中的磁盘名称,磁盘名称被解释为方案:

fansh> "C:\\Users".toUri { echo(path); echo(scheme) }
[\Users]
c
fansh> "/Users".toUri { echo(path); echo(scheme) }
[Users]
null

然后 File 构造函数失败,因为需要“文件”方案或空方案:

public static java.io.File uriToFile(Uri uri)
{
  if (uri.scheme() != null && !uri.scheme().equals("file"))
    throw ArgErr.make("Invalid Uri scheme for local file: " + uri);
  return new java.io.File(uriToPath(uri));
}

我在这里创建了一个问题,以便 F4 在构建 FAN_ENV_PATH 时会自动跳过空项目 – https://github.com/xored/f4/issues/25

于 2013-11-26T07:09:17.937 回答
0

我认为问题与路径末尾的正斜杠有关,如错误消息的这一行所示

Invalid Uri scheme for local file: c:\dev\f4workspace\auth\bin\fan/

但是,我发现这样的路径不存在。我手动创建了 bin 和 fan 文件夹,错误消失了。老实说,我真的不知道为什么 F4 需要并检查该文件夹,因为到目前为止它还没有在其中写入任何文件。

于 2013-11-22T14:33:53.250 回答