Почему Scala на Mac не работает при запуске в каталоге Unicode - PullRequest
6 голосов
/ 09 апреля 2019

Я пытаюсь просто скомпилировать файл scala helloworld из каталога, названного с использованием символов Юникода, но компилятор scala не запускается.Это успешно, когда я изменяю каталог из папки с именем в юникоде.

Detail

Учитывая классический класс Helloworld.scala, такой как тот, что ниже, который расположен в каталоге:

/Users/me/Dev/Company/???????/code_folder

Я не могу запустить scalac для кода, если мой текущий каталог находится в code_folder , который является корневым каталогом для Helloworld.scala.Когда я изменяю каталоги из папки с юникодным именем /???????, компилятор прекрасно работает с тем же кодом.Поэтому может показаться, что scalac не работает при попытке скомпилировать код, находясь в папке с символами Юникода.Это почему?Это системная ошибка?Непроанализированная ошибка Unicode между ОС, запускающей скалярный процесс?

object Main{
    def main(args:  Array[String]): Unit = {
        println("Hello world")
    }
}

Я ожидал скомпилированный файл.Я получаю сообщение об ошибке:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at scala.tools.util.PathResolver$Environment$.scalaExtDirs(PathResolver.scala:77)
    at scala.tools.util.PathResolver$Defaults$.scalaExtDirs(PathResolver.scala:127)
    at scala.tools.nsc.settings.StandardScalaSettings.$init$(StandardScalaSettings.scala:31)
    at scala.tools.nsc.settings.MutableSettings.<init>(MutableSettings.scala:28)
    at scala.tools.nsc.Settings.<init>(Settings.scala:19)
    at scala.tools.nsc.Driver.process(Driver.scala:53)
    at scala.tools.nsc.Driver.main(Driver.scala:80)
    at scala.tools.nsc.Main.main(Main.scala)
Caused by: java.lang.IllegalArgumentException: Error decoding percent encoded characters
    at java.base/sun.net.www.ParseUtil.decode(ParseUtil.java:209)
    at java.base/jdk.internal.loader.FileURLMapper.getPath(FileURLMapper.java:64)
    at java.base/jdk.internal.loader.FileURLMapper.exists(FileURLMapper.java:73)
    at java.base/jdk.internal.loader.URLClassPath$JarLoader.getJarFile(URLClassPath.java:802)
    at java.base/jdk.internal.loader.URLClassPath$JarLoader.access$900(URLClassPath.java:692)
    at java.base/jdk.internal.loader.URLClassPath$JarLoader$1.run(URLClassPath.java:751)
    at java.base/jdk.internal.loader.URLClassPath$JarLoader$1.run(URLClassPath.java:744)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/jdk.internal.loader.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:743)
    at java.base/jdk.internal.loader.URLClassPath$JarLoader.<init>(URLClassPath.java:718)
    at java.base/jdk.internal.loader.URLClassPath$3.run(URLClassPath.java:486)
    at java.base/jdk.internal.loader.URLClassPath$3.run(URLClassPath.java:469)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/jdk.internal.loader.URLClassPath.getLoader(URLClassPath.java:468)
    at java.base/jdk.internal.loader.URLClassPath.getLoader(URLClassPath.java:437)
    at java.base/jdk.internal.loader.URLClassPath.findResource(URLClassPath.java:280)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findResourceOnClassPath(BuiltinClassLoader.java:479)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findResource(BuiltinClassLoader.java:303)
    at java.base/java.lang.ClassLoader.getResource(ClassLoader.java:1393)
    at java.base/java.lang.ClassLoader.getSystemResource(ClassLoader.java:1658)
    at java.base/java.lang.ClassLoader.getSystemResourceAsStream(ClassLoader.java:1762)
    at java.base/java.lang.Class.getResourceAsStream(Class.java:2607)
    at scala.util.PropertiesTrait.scalaProps(Properties.scala:39)
    at scala.util.PropertiesTrait.scalaProps$(Properties.scala:37)
    at scala.tools.reflect.WrappedProperties$AccessControl$.scalaProps$lzycompute(WrappedProperties.scala:49)
    at scala.tools.reflect.WrappedProperties$AccessControl$.scalaProps(WrappedProperties.scala:49)
    at scala.util.PropertiesTrait.scalaPropOrNone(Properties.scala:71)
    at scala.util.PropertiesTrait.scalaPropOrNone$(Properties.scala:71)
    at scala.tools.reflect.WrappedProperties$AccessControl$.scalaPropOrNone(WrappedProperties.scala:49)
    at scala.util.PropertiesTrait.$init$(Properties.scala:83)
    at scala.tools.reflect.WrappedProperties$AccessControl$.<init>(WrappedProperties.scala:49)
    at scala.tools.reflect.WrappedProperties$AccessControl$.<clinit>(WrappedProperties.scala)
    ... 8 more

Версия: scalac -version Scala compiler version 2.12.8 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.

MacOS версия 10.13.6

1 Ответ

1 голос
/ 10 апреля 2019

Не совсем решение, но некоторая информация:

Я настроил свою папку следующим образом:

/home/nicolas/Private/???????/

Когда ClassLoader пытается загрузить классы вашего проектаон создает список путей для поиска классов в виде списка URLClassPath Теперь, когда код продолжается и пытается проанализировать эти пути, он вызывает sun.net.www.ParseUtil.decode ()

Когда я ставлю здесь точку останова, я вижу, что путь для нашего класса:

/home/nicolas/Private/%ed%a0%b5%ed%b4%98%ed%a0%b5%ed%b4%ab%ed%a0%b5%ed%b4%a6%ed%a0%b5%ed%b4%a0%ed%a0%b5%ed%b4%ac%ed%a0%b5%ed%b4%a1%ed%a0%b5%ed%b4%a2/target/scala-2.12/classes/

, поэтому он каким-то образом переводит ??????? в строку в процентах: %ed%a0%b5%ed%b4%98%ed%a0%b5%ed%b4%ab%ed%a0%b5%ed%b4%a6%ed%a0%b5%ed%b4%a0%ed%a0%b5%ed%b4%ac%ed%a0%b5%ed%b4%a1%ed%a0%b5%ed%b4%a2

Это, в свою очередь, создает кодировку CharsetDecoder для UTF-8:

CharsetDecoder dec = ThreadLocalCoders.decoderFor("UTF-8")
                                      .onMalformedInput(CodingErrorAction.REPORT)
                                      .onUnmappableCharacter(CodingErrorAction.REPORT);

и пытается декодировать вышеуказанный URL-адрес, но это не удается, и поэтому классы не могут быть загружены.

Теперь, еслиЯ иду сюда https://www.branah.com/unicode-converter и пытаюсь преобразовать ??????? в% кодированную строку, это дает мне

%f0%9d%94%98%f0%9d%94%ab%f0%9d%94%a6%f0%9d%94%a0%f0%9d%94%ac%f0%9d%94%a1%f0%9d%94%a2

И если при отладке я изменяю URL, используя это закодированное строковое значение,то есть

/home/nicolas/Private/%f0%9d%94%98%f0%9d%94%ab%f0%9d%94%a6%f0%9d%94%a0%f0%9d%94%ac%f0%9d%94%a1%f0%9d%94%a2/target/scala-2.12/classes/

Затем он анализирует его правильно и продолжает идти.

Так что я не знаю, где это происходитчто %ed%a0%b5%ed%b4%98%ed%a0%b5%ed%b4%ab%ed%a0%b5%ed%b4%a6%ed%a0%b5%ed%b4%a0%ed%a0%b5%ed%b4%ac%ed%a0%b5%ed%b4%a1%ed%a0%b5%ed%b4%a2

Интересно то, что если я использую тот же веб-сайт и пытаюсь конвертировать обратно %ed%a0%b5%ed%b4%98%ed%a0%b5%ed%b4%ab%ed%a0%b5%ed%b4%a6%ed%a0%b5%ed%b4%a0%ed%a0%b5%ed%b4%ac%ed%a0%b5%ed%b4%a1%ed%a0%b5%ed%b4%a2, то я также получаю ???????

Так что я немного запутался

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...