我该如何解决这个问题:
命令:
$ ceylon format source/com/example/helloworld/*
例外:
Exception in thread "main" java.lang.NoSuchMethodError: ceylon.language.runtime_.getMaxArraySize()Lceylon/language/Integer;
at ceylon.collection.Hashtable.<init>(Hashtable.ceylon:35)
at ceylon.collection.Hashtable.<init>(Hashtable.ceylon)
at ceylon.collection.HashMap.$default$hashtable(HashMap.ceylon:31)
at ceylon.formatter.options.Spaces$cache_.<init>(IndentMode.ceylon:62)
at ceylon.formatter.options.Spaces$cache_.<init>(IndentMode.ceylon)
at ceylon.formatter.options.Spaces.<init>(IndentMode.ceylon:59)
at ceylon.formatter.options.FormattingOptions.$default$indentMode(FormattingOptions_generated.ceylon:355)
at ceylon.formatter.options.FormattingOptions.<init>(FormattingOptions_generated.ceylon)
at ceylon.formatter.options.loadProfile_.loadProfile(profiles.ceylon:79)
at ceylon.formatter.options.loadProfile_.loadProfile(profiles.ceylon)
at ceylon.formatter.options.commandLineOptions_.commandLineOptions(formattingOptions.ceylon:125)
at ceylon.formatter.options.commandLineOptions_.commandLineOptions(formattingOptions.ceylon)
at ceylon.formatter.run_.run(run.ceylon:285)
...
我想我必须重新安装格式化程序。但是哪个版本?
无缘无故以下命令有效:
ceylon run ceylon.formatter source/com/example/helloworld/*.ceylon
区别在哪里,我该如何解决。
答案 0 :(得分:4)
ceylon.language.runtime
曾经是implemented in hand-written Java code。在此代码中,getMaxArraySize()
意外returned ceylon.language.Integer
应该返回long
。这有效,但不太正确。
然后,在Ceylon 1.2中的原生支持下,runtime
(以及其他一些对象)被rewritten作为本机Ceylon代码。由于Ceylon编译器将其转换为Java,因此该方法现在可以获得正确的返回类型long
。新编译的模块现在将调用此方法,但针对旧ceylon.language
编译的代码仍将尝试调用返回ceylon.language.Integer
的方法,该方法将导致您的NoSuchMethodError
。
这里发生的事情似乎是ceylon format
运行ceylon.formatter/1.1.0
,它是针对ceylon.language/1.1.0
编译的,现在无法与ceylon.language/1.2.0
一起运行。 ceylon run ceylon.formatter
可能由于某种原因而运行ceylon.formatter/1.2.0
,这有效。
我不确定你需要做些什么来解决这个问题。我更改了ceylon format
插件的工作方式recently,因此您可能需要删除ceylon format
脚本(ceylon-format
或ceylon-format.bat
文件中的某个.ceylon/bin
或on.('ready', ...)
文件1}},我相信)。希望新的已经存在,准备接管。
答案 1 :(得分:4)
尝试ceylon plugin uninstall format
并查看是否可以解决问题。
第二种选择是说ceylon plugin install ceylon.formatter/1.2.0
ceylon format
无效但ceylon run
之所以有效,是因为您安装的ceylon format
会查找硬编码版本1.1
,而不是{39} ; t兼容,而ceylon run
将查找与您正在使用的当前Ceylon版本兼容的任何版本。 (所以它会找到1.1.0和1.2.0,但它会丢弃1.1.0,因为它不兼容,因此自动选择1.2.0)