मेरे पास मेरे पीसी में जेडीके 7 और 8 स्थापित है।

मैं JAVA_HOME को JDK 8 पर सेट करने का प्रयास करता हूं और मावेन पोम फ़ाइल में, मैं नीचे के रूप में 1.7 पर सेट करता हूं:

<properties>
    <maven.compiler.target>1.7</maven.compiler.target>
    <maven.compiler.source>1.7</maven.compiler.source>
</properties>

मेवेन बिल्ड के दौरान मुझे नीचे त्रुटि मिली:

incomparable types: boolean and java.lang.Object

स्रोत कोड है:

Map mapData = (LinkedHashMap)it.next();
if(true == mapData.get("isTrueOrFalse")){ // java 8 doesn't allow this, it have to be [true == (boolean)mapData.get("isTrueOrFalse")]
    xxx
}

मैं स्रोत कोड नहीं बदल सकता, इसलिए मैं अपना JAVA_HOME जेडीके 7 में बदलता हूं और मेवेन पोम 1.7 के रूप में रहता है। तब मैं सफलतापूर्वक मेवेन के माध्यम से निर्माण कर सकता हूं।

मेरी समझ है, स्रोत और लक्ष्य निर्धारित करके, यह मुझे कम संगत जावा संस्करण पर संकलित करने की अनुमति देनी चाहिए, लेकिन ऐसा नहीं है। क्या कोई इसे समझाने में मदद कर सकता है?

2
Sam YC 11 अक्टूबर 2019, 06:53

2 जवाब

अपाचे मेवेन पृष्ठ कहता है कि:

केवल लक्ष्य विकल्प सेट करने की गारंटी नहीं है कि आपका कोड वास्तव में निर्दिष्ट संस्करण (...) के साथ JRE पर चलता है उसी तरह, स्रोत विकल्प सेट करना यह गारंटी नहीं देता है कि आपका कोड वास्तव में निर्दिष्ट संस्करण के साथ JDK पर संकलित है

आप पहले प्लगइन को सीधे कॉन्फ़िगर करने का प्रयास कर सकते हैं (इसके बजाय आपके पास pom.xml पर क्या है):

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
      <verbose>true</verbose>
      <fork>true</fork>
      <executable><!-- path-to-javac --></executable>
      <compilerVersion>1.7</compilerVersion>
      <source>1.7</source>
      <target>1.7</target>
    </configuration>
  </plugin>
</plugins>

अंत में, आप संकलन स्रोतों का उपयोग करके देख सकते हैं एक अलग JDK

0
Villat 11 अक्टूबर 2019, 07:16
मैंने अपना जवाब संपादित कर लिया है, कृपया उस कॉन्फ़िगरेशन का उपयोग करने का प्रयास करें जो संकलक को आपके जेडीके 1.7 पथ पर निष्पादन योग्य सेट करता है (उस लाइन को अपने कंप्यूटर पथ के अनुसार बदलें)।
 – 
Villat
11 अक्टूबर 2019, 07:18
यह जावैक का पूरा पथ होना चाहिए, जैसे Your_JAVA_HOME/bin/javac
 – 
Villat
11 अक्टूबर 2019, 07:20
अगर मैं JDK 1.7 के लिए पथ बदलता हूं, तो यह मेरे उदाहरण के अनुसार काम करता है, यह इसे JAVA_HOME से सेट करने जैसा ही है। मेरा प्रश्न अधिक है, अगर मैं JDK 1.8 का उपयोग करता हूं और संकलन स्तर को 1.7 पर सेट करता हूं, तो यह काम नहीं करता है। Oracle दस्तावेज़ से पढ़कर, javac को अपेक्षानुसार काम करना चाहिए docs.oracle.com/en/java/javase/11/tools/…। नीचे, मावेन javac का भी उपयोग कर रहा है।
 – 
GMsoF
11 अक्टूबर 2019, 07:29
source विकल्प javac को निर्दिष्ट JDK संस्करण के साथ स्रोत फ़ाइलों को संकलित करने का निर्देश नहीं देता है, यह javac को स्वीकृत स्रोत कोड के संस्करण की जांच करने का निर्देश देता है। दूसरी ओर, target विकल्प यह सुनिश्चित करता है कि उत्पन्न वर्ग फ़ाइलें उस संस्करण के साथ संगत होंगी।
 – 
Villat
11 अक्टूबर 2019, 07:35

जावा संगतता पोस्ट की इतनी सारी खोज के बाद, मुझे दो संभावित कारण मिले कि ऐसा क्यों हो रहा है:

1) यह JDK 7 में एक बग है, इसे JDK 7 को इसे संकलित करने की अनुमति नहीं देनी चाहिए क्योंकि प्रकार मेल नहीं खाता है। यह JDK 8 में तय है, इसलिए हम -source=1.7 और -target=1.7 का भी उपयोग करते हैं, इसे पार करने की अनुमति नहीं है। JDK 1.7 पश्चगामी संगतता को तोड़ता है? (जेनेरिक)

2) यह जावा कार्यान्वयन रिटर्न प्रकार के संगत नहीं होने के कारण हो सकता है, जबकि JDK 8 का उपयोग -source=1.7 और -target=1.7 के लिए संकलित करते समय, बिल्ड पथ (बूटस्ट्रैप क्लास) अभी भी JDK 8 की ओर इशारा करेगा, जैसे कि जावा का कार्यान्वयन Map भिन्न प्रकार लौटा सकता है जो उपरोक्त समस्या का कारण बनता है। जावा 8 पश्चगामी संगतता के बारे में समस्या: JDK में नए तरीके< /ए>

0
GMsoF 11 अक्टूबर 2019, 11:36