2010-01-27 15 views
8

Pracuję nad projektem Scala, który importuje dwie biblioteki Java. Z powodu złego planowania, dwie biblioteki Java mają podobne nazwy pakietów, jedna z com z przodu, druga bez.Scala import java package appending com

Problem polega na tym, że Scala szuka pakietu z pierwszym komunikatem i mówi mi, że pakiet nie istnieje. Jeśli usunę wszystkie odwołania do biblioteki za pomocą polecenia com przed pakietem, kompilacja działa.

Aby pokazać przykład, że ma sens:

W foo.jar mamy company.product.core pakiet

W bar.jar mamy com.company.product.other pakietu.

Jeśli oba słoiki są na ścieżce klasy, linia:

import company.product.core.ClassName 

zakończy się błędem „rdzeń wartość nie jest członkiem paczki com.companyname.product” Jeśli usuniemy bar.jar, na kompilacji działa w porządku.

Czy Scala próbuje mnie uratować przed wpisaniem kom.? Czy istnieje sposób, aby powiedzieć, aby zaimportować tylko to, co mu powiem?

Odpowiedz

11

Użyj prefiksu _root_ w instrukcjach importu. Sprawia, że ​​rozdzielczość pakietów jest absolutna.

import _root_.company.product.core.ClassName 
import _root_.com.company.product.other.ClassName 

Odnosząc się do komentarza: przy względnych importach możesz zrobić coś takiego. Zasadniczo oszczędza ci trochę pisania.

import _root_.company.product.core 
import ClassAFromCore 
import ClassBFromCore 
+0

To działa, ale jestem ciekawy, dlaczego Scala to robi? – Jeff

+0

Scala włącza dopasowanie względne z wcześniejszego importu pakietu. Podobnie jak po "import scala.collection._" możesz po prostu wywołać "import mutable._", aby uzyskać "scala.collection.mutable._". Powoduje mnóstwo zabawnych rzeczy dzięki nazwie pakietu "net". –

+0

@ Tristan import collection._ działa również (scala jest już zaimportowana) –

4

Ja myślę, że to miejsce, gdzie umieścić ten wiersz importu należy do pakietu zaczynające się od „com.”, tak:

package com.whatever 
import company.product.core.ClassName 

Oznacza to, że wszystkie com., w tym com.company jest częścią zakresu, i dlatego com.company jest w cieniu company, który jest katalogiem głównym, ponieważ obiekty znajdujące się bliżej w zasięgu hierarchii śledzą te dalej.

Niezależnie od tego, ile jest warta, Scala 2.8 będzie miała nieco inne zasady. Teraz, jeśli mogę zdefiniować paczkę jako:

package com.c.b.a 

następnie tylkoa będzie zakres. Jeśli chcę uzyskać poprzednie zachowanie, muszę to zrobić:

package com 
package c 
package b 
package a