2012-02-06 9 views
10

के लिए संकलन करने के लिए जेडीके 7 का उपयोग करें मैं इसे थोड़ी देर के लिए काम करने की कोशिश कर रहा हूं लेकिन अभी तक कोई भाग्य नहीं है।मेवेन - जेवीएम 5

मैं JDK7 को JAVA_HOME इशारा साथ चलाने के लिए चाहते हैं, लेकिन मैं एक परियोजना JVM 5. के लिए मैं documentation के माध्यम से पढ़ा है संकलित करने के लिए चाहते हैं, मैं इतने पर similar posts पाया है, लेकिन उनमें से कोई मेरी सेटअप में काम करने के लिए लग रहे हैं।

मैं पहली बार सिर्फ target और source स्थापित करने के साथ करने की कोशिश की, लेकिन मैं एक त्रुटि मिली:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.5</source> 
     <target>1.5</target> 
    </configuration> 
</plugin> 

[ClassName] is not abstract and does not override abstract method getParentLogger() in CommonDataSource

जहां तक ​​मुझे लगता है कि वर्ग JDK 7 और अतिरिक्त विधि कि त्रुटि फेंक रहा है में अद्यतन किया गया था समझा था अभी जोड़ा गया। मुझे जेडीके 5 के रनटाइम का उपयोग करने की आवश्यकता है जिसमें पुराना कार्यान्वयन है और सब कुछ ठीक काम करना चाहिए। मैं JAVA5_HOME अपने सिस्टम, मैं यह लॉग में सही वर्गों लोड हो रहा है देख सकते हैं पर सही ढंग से निर्धारित किया है

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <verbose>true</verbose> 
     <source>1.5</source> 
     <target>1.5</target> 
     <compilerArguments> 
      <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar</bootclasspath> 
     </compilerArguments> 
    </configuration> 
</plugin> 

, लेकिन मैं एक और त्रुटि मारा:: तो मैं यह करने के

[loading ZipFileIndexFileObject[c:\Program Files\Java\jdk1.5.0_22\jre\lib\rt.jar(*.class)]]
...
...
[ClassName] error: package javax.crypto does not exist

कौन सा पर्याप्त उचित है , क्योंकि मैंने bootclasspath में jce.jar (क्रिप्टोग्राफी कक्षाएं) शामिल नहीं की थीं। एक चीज है जो मुझे पहेली करता है, यद्यपि। भले ही bootclasspath में केवल जावा 5 रनटाइम है, मेरे पास क्लासपाथ में जेआरई 7 से बहुत सारी लाइब्रेरी हैं। वे कहीं भी निर्दिष्ट नहीं हैं।

[search path for class files: c:\Program Files (x86)\Java\jdk1.5.0_22\jre\lib\rt.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\dnsns.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\localedata.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunec.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunjce_provider.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\sunmscapi.jar,c:\Program Files\Java\jdk1.7.0_02\jre\lib\ext\zipfs.jar, ...]

अगर मैं कोशिश करते हैं और (JRE5 से) jce.jar जोड़ने के लिए, मैं वापस पहली त्रुटि के लिए मिलता है:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <verbose>true</verbose> 
     <source>1.5</source> 
     <target>1.5</target> 
     <compilerArguments> 
      <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jce.jar</bootclasspath> 
     </compilerArguments> 
    </configuration> 
</plugin> 

The type [ClassName] must implement the inherited abstract method CommonDataSource.getParentLogger()

मैं यह भी देखना rt.jar का कोई निशान लोड किए जा रहे हैं, लेकिन मैं java.lang त्रुटि नहीं मिली है, इसलिए क्लासपाथ पर कुछ कक्षाएं लोड की जा रही हैं।

मैं इसे बैच स्क्रिप्ट बनाकर अस्थायी रूप से ठीक कर दूंगा जो इमारत से पहले JAVA_HOME को ओवरराइट करता है और बाद में इसे वापस सेट करता है, लेकिन मैं वास्तव में यह सही तरीके से करना चाहता हूं। यह इतनी चरम उपयोग-मामले के रूप में प्रतीत नहीं होता है। :)

मैं यहाँ क्या गलत कर रहा हूं?

उत्तर

1

आप अगर जरूरत Maven-संकलक प्लगइन पर bootclasspath विन्यास विकल्प का उपयोग कर सकते हैं:

<compilerArguments> 
    <bootclasspath>xxxxxxxxx</bootclasspath> 
</compilerArguments> 

आप इसे here के बारे में अधिक पढ़ सकते हैं। उदाहरण के तहत नोट देखें।

+1

मेरे उदाहरण देखें, मैं इसका उपयोग कर रहा हूं लेकिन अगर मैं एकाधिक जार निर्दिष्ट करता हूं तो यह काम नहीं करता है। क्या मैं कुछ भूल रहा हूँ? –

3

जावा का पिछला संस्करण हम जावा के पिछले संस्करणों का समर्थन करने में विशेष रूप से अच्छे नहीं हैं। जावा 7 के लिए यह बहुत बेहतर प्रतीत होता है।

यहां एक प्रोग्राम है जो किसी भी संस्करण के तहत संकलित होना चाहिए।

public class Main { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
    } 
} 

$ javac -target 1.7 -source 1.7 Main.java 
$ javac -target 1.6 -source 1.6 Main.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
1 warning 
$ javac -Xbootclasspath:/usr/java/jdk1.6.0_29/jre/lib/rt.jar -target 1.6 -source 1.6 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.5.0_22/jre/lib/rt.jar -target 1.5 -source 1.5 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.4.0_30/jre/lib/rt.jar -target 1.4 -source 1.4 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.3.1_29/jre/lib/rt.jar -target 1.3 -source 1.3 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.2.2_017/jre/lib/rt.jar -target 1.2 -source 1.2 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.1 -source 1.2 Main.java 
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.1 -source 1.1 Main.java 
javac: invalid source release: 1.1 
Usage: javac 
use -help for a list of possible options 
$ javac -Xbootclasspath:/usr/java/jdk1.1.8_16/jre/lib/rt.jar -target 1.0 -source 1.0 Main.java 
javac: invalid target release: 1.0 
Usage: javac 
use -help for a list of possible options 

आप जावा के पिछले संस्करण के लिए संकलन करने की जरूरत है, तो आप आदर्श आप के लिए संकलित करने के लिए चाहते हैं जावा के संस्करण के लिए, एक bootclasspath प्रदान करने के लिए की जरूरत है। जावा 7 जावा 1 पर वापस जाने के लिए सभी तरह से समर्थन करने में सक्षम प्रतीत होता है।2

+0

भले ही मैं '' और '' का उपयोग करता हूं? मैं दस्तावेज़ों से समझ गया कि यह वही है जो उन्हें करना है - अन्य जेवीएम के साथ संगत कोड उत्पन्न करें। –

+3

आप * नवीनतम जेडीके के तहत पहले जेवीएम के लिए कोड संकलित कर सकते हैं। यह उचित बाइट कोड का उत्पादन करेगा और यदि आप लक्ष्य JVM में उपलब्ध भाषा संरचनाओं का उपयोग करने का प्रयास नहीं करते हैं तो त्रुटियों को फेंक दें। आपको केवल अतिरिक्त सावधानी बरतनी होगी क्योंकि जावैक आपको पुराने तरीकों/कक्षाओं का उपयोग करने से नहीं रोकेगा जो पुरानी जेवीएम मानक प्रणाली में नहीं हैं ... –

+0

@AlexCiminian आप सही विकल्प का उपयोग कर रहे हैं, समस्या यह है कि आपका 'जावैक 'इस विकल्प का समर्थन करता है। जावा 5.0 और 6 पिछले संस्करणों के लिए संकलन में बहुत खराब थे, हालांकि जावा 7 जावा 1.2 पर वापस आ रहा है। यदि आप 'rt.jar' के पुराने संस्करण का उपयोग करते हैं तो इसे आपको विधियों/कार्यक्षमता का उपयोग करने से रोकना चाहिए जो मौजूद नहीं है आपका लक्ष्य संस्करण –

1

समस्या जावा 7 पिछड़ा संगतता के साथ है।

बहुत कम वर्ग हैं जो विभिन्न प्रकृति के मुद्दों को हल करने के लिए असंभव होने के कारण पिछड़ा संगतता को संरक्षित नहीं करते हैं, डेटासोर्स उनमें से एक होता है।

तो, या तो आप नए हस्ताक्षर (यहां तक ​​कि पिछड़े संगतता मोड में) के सम्मान के लिए अपनी कक्षा को अनुकूलित करते हैं, या आपको वर्चुअल मशीन के एक अलग संस्करण का उपयोग करने के लिए मजबूर किया जाएगा।

आप यहाँ और अधिक जानकारी के पढ़ सकते हैं: http://www.oracle.com/technetwork/java/javase/compatibility-417013.html

1

Maven संकलक विकल्पों में कई जार का उपयोग करने के लिए, जार के बीच $ {path.separator} स्ट्रिंग का उपयोग करें:

<compilerArguments> 
    <bootclasspath>${env.JAVA5_HOME}/jre/lib/rt.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jce.jar${path.separator}${env.JAVA5_HOME}/jre/lib/jsse.jar</bootclasspath> 
</compilerArguments> 
+1

यदि आप मेरा उदाहरण देखें, तो मैं यही कर रहा था। –

5

इस उत्तर प्रश्न के शीर्षक पर लक्षित है, प्रश्न की विशिष्ट समस्याओं को विस्तार से नहीं।

मैं अपने प्रोजेक्ट में इस समाधान का उपयोग करके समाप्त हुआ, जो मुझे मैवेन प्रोफाइल सक्रिय करके चुनिंदा कस्टम बूटस्ट्रैप क्लासपाथ का उपयोग करने की अनुमति देता है। मैं दृढ़ता से इसके लिए प्रोफ़ाइल का उपयोग करने की अनुशंसा करता हूं, क्योंकि अन्यथा यह किसी भी ऐसे व्यक्ति के लिए असफल हो जाता है जिसमें पर्यावरण परिवर्तनीय सेट न हो (बहुत बुरा, विशेष रूप से ओपन सोर्स प्रोजेक्ट के लिए)। मैं केवल "स्वच्छ & बिल्ड" कार्रवाई के लिए अपने आईडीई में इस प्रोफ़ाइल को सक्रिय करता हूं।

<profile> 
     <id>compileWithJava5</id> 
     <!-- 
      NOTE 
      Make sure to set the environment variable JAVA5_HOME 
      to your JDK 1.5 HOME when using this profile. 
     --> 
     <properties> 
      <java.5.home>${env.JAVA5_HOME}</java.5.home> 
      <java.5.libs>${java.5.home}/jre/lib</java.5.libs> 
      <java.5.bootclasspath>${java.5.libs}/rt.jar${path.separator}${java.5.libs}/jce.jar</java.5.bootclasspath> 
     </properties> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <configuration> 
         <source>1.5</source> 
         <target>1.5</target> 
         <compilerArguments> 
          <bootclasspath>${java.5.bootclasspath}</bootclasspath> 
         </compilerArguments> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile>