Пакет содержит объект и пакет с тем же именем

У меня возникают проблемы при компиляции некоторых 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-конфликт:стратегия", где стратегия - это либо пакет, объект, ошибка.

Другие вопросы по тегам