मैं यह समझने की कोशिश कर रहा हूं कि जावा के आईडीई में जावा के साथ स्कैला कोड कैसे काम करता है। स्पार्क जावा के साथ काम करते समय मुझे यह संदेह हुआ जहां मैंने स्कैला पैकेज भी कोड में और संबंधित वर्गों और विधियों का उपयोग करके देखा।

मेरी समझ कहती है, स्कैला कोड को जावा.क्लास फाइलों में कनवर्ट करने के लिए स्कैला के कंपाइलर की आवश्यकता होती है और फिर उनके बाद से जेडीके जेवीएम में बाइनरी में कनवर्ट करने और क्रियाएं करने के लिए अपना हिस्सा करता है। कृपया मुझे सुधारें अगर मैं गलत हूँ।

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

यह मेरा पोम.एक्सएमएल है

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>spark</groupId>
  <artifactId>Project</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath />
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> 
                </exclusion> </exclusions> -->
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql-kafka-0-10_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>

        <!-- Gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
            <scope>provided</scope>
        </dependency>

        <!-- Avro Messages -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-avro_2.12</artifactId>
            <version>3.1.2</version>
        </dependency>

        <!-- Spark MLLIB -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.12</artifactId>
            <version>3.0.0</version>
            <scope>provided</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>commons-compiler</artifactId>
        </dependency>
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <!--Spark java.lang.NoClassDefFoundError: org/codehaus/janino/InternalCompilerException -->
            <dependency>
                <groupId>org.codehaus.janino</groupId>
                <artifactId>commons-compiler</artifactId>
                <version>3.0.16</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.janino</groupId>
                <artifactId>janino</artifactId>
                <version>3.0.16</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>  
</project>

और उदाहरण के लिए मेरी जावा क्लास फ़ाइल में स्कैला के नीचे आयात का उपयोग कर रहा हूं। लेकिन शाब्दिक रूप से आइडिया नहीं मिल रहा है जिससे जार इसे उठा रहा है और इसे आगे की प्रक्रिया के लिए Java.class में संकलित किया जा रहा है।

import scala.collection.JavaConverters;

क्या कोई मुझे इस अज्ञात जादू को समझने में मेरी मदद कर सकता है?

-1
Oxana Grey 7 जिंदा 2022, 15:27
2
संकलित .class फ़ाइलों को उनके मूल कंपाइलर/लाइब्रेरी निर्माता (स्केलैक, अन्य विक्रेता के जावैक, पायथन) की आवश्यकता नहीं है।
 – 
Joop Eggen
7 जिंदा 2022, 15:36

2 जवाब

सबसे बढ़िया उत्तर

निर्भरता वर्ग फ़ाइल रूप में जहाज। वह JavaConverters वर्ग वास्तव में scalac द्वारा संकलित किया जाना चाहिए। हालांकि, जेनिनो के अनुरक्षकों ने इसे अपने हार्डवेयर पर किया है, संकलित परिणाम को मावेनसेंट्रल के सर्वर पर भेज दिया है, जिसने इसे सभी दर्पणों में वितरित कर दिया है, इस तरह यह आपके सिस्टम की डिस्क पर समाप्त हो गया, यही कारण है कि आप नहीं नहीं करते हैं। em> को इसका उपयोग करने के लिए scalac की आवश्यकता है।

3
rzwitserloot 7 जिंदा 2022, 15:32
तो आपके कहने का मतलब है "स्कैला कोड जो जावा.क्लास फाइलों में स्कैला कोड को बदलने के लिए आवश्यक है" जेनिनो के लोगों ने पहले से ही अपनी मशीनों में किया है और जावा जार में रखा है और मेरे जैसे लोगों को इसका इस्तेमाल करने के लिए दिया गया है। तो जब भी मैं अपने स्पार्क जावा प्रोजेक्ट में स्कैला आयात देखता हूं, स्कैला कोड है लेकिन जावा कंपाइलर के संगत रूप में है। क्या यह समझ में आता है? मुझे लगता है कि मैं अभी भी पूरी तरह से कल्पना नहीं कर पा रहा हूं
 – 
Oxana Grey
7 जिंदा 2022, 15:56
2
हां। आप किसी भाषा में कोड लिखते हैं, एक कंपाइलर फिर उसे क्लास फाइलों में बदल देता है जो एक 'सामान्य भाषा' है (स्कैला कोड को स्केलैक द्वारा क्लास फाइलों में बदल दिया जाता है। जावा कोड को जावैक द्वारा उसी क्लास फाइलों में बदल दिया जाता है, आदि) - और फिर एक JVM (java.exe) इन क्लास फाइलों को निष्पादित करता है। यानी java.exe को इस बात की परवाह करने की जरूरत नहीं है कि यह किस भाषा में लिखा गया है।
 – 
rzwitserloot
7 जिंदा 2022, 16:02
1
कल्पना कीजिए कि हम एस्पेरान्तो में एक साथ एक किताब लिखने का फैसला करते हैं। आप केवल फ्रेंच जानते हैं, मैं केवल डच जानता हूं। मैं अपना हिस्सा (डच में) लिखता हूं, इसका अनुवाद करवाता हूं, हम इसे एस्पेरांतो की किताब में डालते हैं। आप अपना हिस्सा (फ्रेंच में) लिखते हैं, उसका अनुवाद करवाते हैं, किताब में भी जाते हैं। कोई व्यक्ति जो पुस्तक खरीदता है उसे केवल एस्पेरान्तो पढ़ने में सक्षम होना चाहिए। वे शायद यह भी नहीं जानते कि अध्याय 1 मूल रूप से डच में और अध्याय 2 फ्रेंच में लिखा गया था। मेवेन आपको अनुवादित पुस्तक देता है, जिसका अर्थ है, आपको डच-> एस्पेरान्तो अनुवादक की आवश्यकता नहीं है।
 – 
rzwitserloot
7 जिंदा 2022, 16:05

जार, उन्होंने केवल फाइलें संकलित की हैं। उनके पास स्रोत फ़ाइलें नहीं होंगी। यदि आप किसी निर्भरता का उपयोग कर रहे हैं, तो यह स्रोत नहीं है, यह संकलित आउटपुट है। तो, आपके मामले में, JavaConverters, भी संकलित है। और यह पैकेज scala.collection से है जो एक बिल्ट-इन पैकेज है।

क्या मैं जान सकता हूँ कि आपके सिस्टम पर Scala स्थापित है?

0
47rakesh 7 जिंदा 2022, 16:06
आपको अपने सिस्टम पर Scala संस्थापित होना चाहिए क्योंकि JavaConverters एक Scala बिल्ट-इन है। बेशक, आपको यहां स्केलैक की आवश्यकता नहीं है क्योंकि JavaConverters स्कैला एसडीके का हिस्सा है। उदाहरण के लिए: क्या आप ArrayList को फिर से संकलित करेंगे? कोई अधिकार नहीं? यदि आप jdk में ArrayList.java खोजते हैं, तो भी आप उसे नहीं खोज सकते। यह फ़ाइल संकलित की जाएगी, ArrayList.class।
 – 
47rakesh
7 जिंदा 2022, 16:12