2010-01-27 16 views
8

संलग्न करना मैं एक स्काला परियोजना पर काम कर रहा हूं जो दो जावा पुस्तकालयों को आयात कर रहा है। खराब योजना के माध्यम से, दो जावा पुस्तकालयों में समान पैकेज नाम होते हैं, एक बिना कॉम के साथ, बिना किसी के।स्कैला आयात जावा पैकेज कॉम

समस्या यह है कि स्कैला पहले कॉम के साथ पैकेज की तलाश में है, और मुझे बता रहा है कि पैकेज मौजूद नहीं है। यदि मैं पैकेज के सामने कॉम के साथ लाइब्रेरी के सभी संदर्भ हटा देता हूं, तो संकलन कार्य करता है।

foo.jar में हम एक पैकेज company.product.core

है bar.jar में हम एक पैकेज com.company.product.other है:

एक उदाहरण है कि बनाता है भावना दिखाने के लिए।

दोनों जार classpath पर हैं, लाइन:

import company.product.core.ClassName 

त्रुटि हम bar.jar निकालते हैं, तो संकलन के साथ "मूल्य कोर पैकेज com.companyname.product का सदस्य नहीं है" विफल ठीक काम करता है।

क्या स्कैला मुझे टाइपिंग कॉम से बचाने की कोशिश कर रहा है। क्या इसे आयात करने का कोई तरीका है जो मैं इसे बताता हूं?

उत्तर

11

आयात विवरणों में _root_ उपसर्ग का उपयोग करें। यह पैकेज संकल्प पूर्ण बनाता है।

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

आप का जिक्र करते हुए टिप्पणी: रिश्तेदार के आयात के साथ आप कुछ इस तरह कर सकता है। यह मूल रूप से आपको कुछ टाइपिंग बचाता है।

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

यह काम करता है, लेकिन मुझे उत्सुकता है कि स्कैला ऐसा क्यों करता है? – Jeff

+0

स्कैला एक पूर्व पैकेज आयात से संबंधित रिश्तेदार को सक्षम बनाता है। जैसे, "scala.collection._ आयात करें" के बाद आप "scala.collection.mutable._" प्राप्त करने के लिए बस "आयात mutable._" को कॉल कर सकते हैं। यह "नेट" पैकेज नाम के साथ कई मजेदार चीजें पैदा करता है। –

+0

@ ट्रिस्टन आयात संग्रह ._ काम भी करता है (स्कैला पहले से ही आयात किया गया है) –

4

मुझे लगता है कि होगा कि जगह आपको लगता है कि आयात लाइन डाल "com. 'से शुरू पैकेज के अंतर्गत आता है, इस तरह:

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

com. के सभी, com.company सहित इसका मतलब है, हिस्सा है दायरे के, और com.company, company को रूट कर रहा है, जो कि रूट है, क्योंकि पदानुक्रम के दायरे में वस्तुओं को आगे की ओर छाया करना है।

जो भी इसके लायक है, स्कैला 2.8 के पास थोड़ा अलग नियम होंगे। अब, अगर मैं के रूप में मेरे पैकेज को परिभाषित:

package com.c.b.a 

तो केवलa दायरे में होगा। अगर मैं पिछले व्यवहार को प्राप्त करना चाहता हूं, तो मुझे यह करना होगा:

package com 
package c 
package b 
package a 
संबंधित मुद्दे