2011-02-25 5 views
19

काम नहीं करता है मैंने अपने स्रोत कोड को source और target कॉन्फ़िगर पैराम का उपयोग करके संस्करण 1.5 संगत होने के लिए मेरे स्रोत कोड को संकलित करने के लिए कहा है। यहाँ मेरी पोम है:मैवेन के साथ जावा कंपाइलर के संसाधन और लक्ष्य को सेट करना -

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com</groupId> 
    <artifactId>user</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>test</name> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.5</source> 
      <target>1.5</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

और मैं इस तरह एक साधारण मुख्य वर्ग है:

package com.user; 
public class Test 
{ 
    public static void main(String[] argv) 
    { 
     System.out.println("".isEmpty()); 
    } 
} 

String#isEmpty() जावा 1.6 के बाद से शुरू की गई थी। हालांकि, mvn compile के साथ मेरे कोड को संकलित करना, जबकि मैं असफल होने की उम्मीद करता क्योंकि मैंने जावा 1.5 में अपने कोड को संकलित करने के लिए मेवेन सेट किया है और String#isEmpty जावा 1.6 में पेश किया गया था। क्या कोई सुझाव दे सकता है कि मैंने गलत क्या किया हो? संकलन करते समय किसी विशेष जावा संस्करण का उपयोग करने के लिए मेवेन को मजबूर करने का सही तरीका क्या है?

जानकारी के लिए, मैं अपाचे मेवेन 2.2.1 और जावैक 1.6.0_19 का उपयोग कर रहा हूं।

धन्यवाद।

उत्तर

28

compiler-plugin page के तल पर टिप्पणी से:

केवल लक्ष्य विकल्प सेट करने की गारंटी नहीं है कि आपके कोड वास्तव में निर्दिष्ट संस्करण के साथ एक JRE पर चलता है। Pitfall एपीआई का अनचाहे उपयोग है जो केवल बाद में जेआरई में मौजूद है जो आपके कोड को एक लिंक त्रुटि के साथ रनटाइम पर विफल कर देगा। इस समस्या से बचने के लिए, आप या तो लक्ष्य JRE से मेल खाते हैं या सत्यापित करने के लिए अपने कोड अनायास ही एपीआई

उपयोग नहीं करता है इसका मतलब यह है कि यद्यपि आप 1.5 जेनरेट कर रहे हैं पशु स्निफर Maven प्लगइन का उपयोग करने के संकलक के बूट classpath कॉन्फ़िगर कर सकते हैं -लेवल बाइटकोड, आप अभी भी (अनजाने में) 1.6 एपीआई विधि कॉल कर सकते हैं। इन invalide API कॉल को ध्वजांकित करने के लिए, वे जिस प्लगइन का उल्लेख करते हैं उसका उपयोग करें।

+1

यह एक अच्छा समाधान है लेकिन दुर्भाग्य से यह आंशिक इंटरफ़ेस कार्यान्वयन जैसे कुछ अन्य एपीआई असंगतताओं को संभाल नहीं करता है। यदि आप इटरेटर की निकासी() विधि को कार्यान्वित नहीं करते हैं तो यह इंटरफ़ेस में 'डिफ़ॉल्ट' कीवर्ड के कारण जावा 8 के तहत संकलित होगा, लेकिन जावा 7 के तहत संकलित नहीं होगा। और यह स्नफ़फर प्लगइन उसको नहीं पकड़ेगा क्योंकि यह केवल एक विधि नहीं है कहते हैं। – Innokenty

+0

यहां पशु स्निफर का उपयोग करने के तरीके पर एक आधिकारिक मार्गदर्शिका है और क्यों: https://maven.apache.org/guides/mini/guide-building-jdk14-on-jdk15.html – Innokenty

8

यदि आप String.isEmpty() नहीं ढूंढना चाहते हैं तो आपको जावा के निचले संस्करण के साथ संकलित करने की आवश्यकता है। स्रोत स्तर भाषा-स्तर की सुविधाओं को नियंत्रित करता है जो आप कर सकते हैं और उपयोग नहीं कर सकते हैं, जैसे कि @Override इंटरफेस पर स्रोत स्तर 1.6 के साथ संकलन की आवश्यकता है। लक्ष्य स्तर बाइटकोड की संगतता को नियंत्रित करता है जो संकलन उत्पन्न करता है। न तो उपलब्ध एपीआई के साथ कुछ भी करना है ... यह सब उस क्लासपाथ पर आधारित है जिसका उपयोग आप इमारत करते समय करते हैं, जिसमें आपके मामले में जावा 1.6 शामिल है।

+0

इसके अलावा, सुनिश्चित करें कि आपके क्लासस्पैट और जावा-एचओएमई दोनों चर सही जेडीके संस्करण को इंगित करते हैं। (मैं इस मुद्दे पर लटका हुआ था, और जब मेरा संकलन करने की आवश्यकता थी तो मेरा जावा एएचओएमई जावा 6 पर इशारा कर रहा था।) – hotshot309

संबंधित मुद्दे