2012-10-29 16 views
11

सीआई-सर्वर (हडसन) पर निर्भर करता है, जिसके लिए मैं जिम्मेदार हूं, मेवेन प्रोजेक्ट बनाता है। पिछले प्रतिबद्ध के बाद, निर्माण विफल रहा:मेवेन कक्षा को संकलित नहीं कर सकता जो rt.jar

[INFO] ------------------------------------------------------------- 
[ERROR] COMPILATION ERROR : 
[INFO] ------------------------------------------------------------- 
[ERROR] \hudson\jobs\path to my class\MyClass.java:[33,62] package com.sun.xml.internal.messaging.saaj.packaging.mime.util does not exist 
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,5] cannot find symbol 
     symbol : class BASE64EncoderStream 
     location: class |fullname of MyClass| 
[ERROR] \hudson\jobs\path to my class\MyClass.java:[75,38] cannot find symbol 
     symbol : class BASE64EncoderStream 
     location: class |fullname of MyClass| 
[INFO] 3 errors 

आवश्यक वर्ग (com.sun.xml.internal.messaging.saaj.packaging.mime.util.BASE64EncoderStream) rt.jar में स्थित है।

मैं इस परियोजना के pom.xml में प्रणाली निर्भरता जोड़ने की कोशिश की (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies पर दिए गए निर्देशों के अनुसार):

<dependency> 
    <groupId>dummy</groupId> 
    <artifactId>dummy</artifactId> 
    <version>1</version> 
    <scope>system</scope> 
    <systemPath>${java.home}/lib/rt.jar</systemPath> 
</dependency> 

यह मदद नहीं की।

सबसे दिलचस्प बात यह है कि सभी फाइलें मेरे कॉलेग्यू की स्थानीय मशीन पर ठीक संकलित होती हैं (वह एक्लिप्स बिल्ड-इन कंपाइलर का उपयोग करते हैं)।

इंटरनेट में मुझे एक ही प्रश्न मिला (लिंक: http://maven.40175.n5.nabble.com/Why-can-t-Maven-find-com-sun-xml-internal-messaging-saaj-util-ByteOutputStream-class-td107361.html)। आखिरी जवाब यह था कि इस समस्या का कारण ओरेकल का जावा कंपाइलर है।

तो, मैंने ओरेकल के जेडीके को ओपनजेडीके में बदल दिया, लेकिन इससे मदद नहीं मिली।

क्या किसी को इस समस्या को हल करने के बारे में कोई सुझाव है?

+0

मैं बाइटऑटपुटस्ट्रीम का उपयोग कर रहा था और यह त्रुटि प्राप्त कर रहा था। जब मैंने इसे ByteArrayOutputStream में बदल दिया, तो यह एक आकर्षण की तरह काम करता था। जेआरई आंतरिक कक्षाओं के बारे में कभी नहीं पता था। – Anshuman

उत्तर

5

गायब वर्ग जेआरई आंतरिक (जैसा कि इसके नामस्थान में दर्शाया गया है) लगता है, और इसे आपके कोड से संदर्भित नहीं किया जाना चाहिए। यह शायद विशिष्ट प्लेटफॉर्म या जेआरई संस्करणों पर ही उपलब्ध है।

इसे किसी अन्य बेस 64 एन्कोडर क्लास के साथ बदलने पर विचार करें, उदा। Apache Commmons Codec project से एक।

+1

वैसे यह एक विशेष समाधान था, अन्य वर्गों के बारे में क्या? उदाहरण के लिए असुरक्षित? एक अच्छा ज्ञात प्रतिस्थापन नहीं है, और इसका उपयोग करने पर सूर्य पर निर्भर होना आवश्यक है। * कक्षाएं, हम धीरे-धीरे क्या कर सकते हैं? –

+0

दुर्भाग्य से मैं उस वर्ग से परिचित नहीं हूं। हालांकि, एक पूरी तरह से नए सवाल के लिए एक अच्छा विषय हो सकता है। – Henrik

+1

जावा 6 के बाद से बेस 64 उपयोगिता खोजने के लिए बाहरी जाने की आवश्यकता नहीं है: वे 'javax.xml.bind.DatatypeConverter' में हैं जो तकनीकी रूप से जेएक्सबी का हिस्सा है लेकिन यदि आप JAXB का उपयोग करते हैं या नहीं तो आप इसका उपयोग कर सकते हैं। – peterh

11

-XDignore.symbol.file निर्दिष्ट करने की आवश्यकता है और rt.jar निर्भरता और <fork>true</fork> जोड़ें क्योंकि संकलक प्लगइन अन्यथा चुपचाप किसी भी -XD झंडे को छोड़ देगा: उदा।

... 
    <dependency> 
     <groupId>groupid</groupId> 
     <artifactId>artifiactId</artifactId> 
     <version>1.0</version> 
     <scope>system</scope> 
     <systemPath>${java.home}/lib/rt.jar</systemPath> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.3</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <compilerArgs> 
        <arg>-XDignore.symbol.file</arg> 
       </compilerArgs> 
       <fork>true</fork> 
      </configuration> 
      ...