Пакет содержит объект и пакет с тем же именем
У меня возникают проблемы при компиляции некоторых Scala с Maven или Eclipse, где я пытаюсь импортировать класс из jar-файла Java, который содержит пространство имен и класс с тем же именем.
Я могу скомпилировать scalac
, тем не мение.
Например, проект Java (jar) содержит:
src/foo/bar.java
src/foo/bar/some_resource.txt
-> foobar.jar
Scala project references foobar.jar
Foobartest.scala:
import foo.bar
class foobartest {
}
Компилятор жалуется на:
package foo contains object and package with same name: bar
one of them needs to be removed from classpath
Использование Maven 3.0.03/Eclipse 3.7.1 с Scala 2.9.0.1 (и maven-scala-plugin
).
Баночка, с которой у меня проблемы, jenkins-core-1.399.jar
- он определенно содержит несколько случаев, когда есть пространство имен и объект с тем же именем.
Я пытаюсь написать плагин Jenkins для Scala (я мог бы сделать это на Java, но предпочел бы scala, так как все наши библиотеки находятся в scala), который зависит от использования Maven -
https://wiki.jenkins-ci.org/display/JENKINS/Plugin+tutorial.
2 ответа
Такое ограничение было указано в SI-4695: объект пакета плохо себя ведет в присутствии файлов классов.
Как указано в SI-2089 (ограничение имен делает некоторые банки непригодными для использования), вы можете попробовать использовать "resolve-term-conflict
", как реализовано в наборе изменений 25145:
Добавил
-Y
возможность разрешения коллизий пространства имен между пакетом и объектом.
Это тупой инструмент: если у людей много таких конфликтов, которые им нужно разрешить в индивидуальном порядке, им, вероятно, не повезет.
val termConflict = ChoiceSetting ("-Yresolve-term-conflict", "strategy", "Resolve term conflicts", 113 List("package", "object", "error"), "error")
// Some jars (often, obfuscated ones) include a package and
// object with the same name. Rather than render them unusable,
// offer a setting to resolve the conflict one way or the other.
// This was motivated by the desire to use YourKit probes, which
// require `yjp.jar` at runtime. See SI-2089.
Фактическая опция компилятора - "-Yresolve-term-конфликт:стратегия", где стратегия - это либо пакет, объект, ошибка.