2017-05-18 18 views
7

तो मैं http ग्राहकजावा 9 कोई वर्ग परिभाषा अपवाद

package com.company; 

import jdk.incubator.http.HttpClient; 

public class Main { 

public static void main(String[] args) { 
    HttpClient client = HttpClient.newHttpClient(); 

    } 
} 

कोशिश करना चाहते हैं और मेरे मॉड्यूल की जानकारी इस

module com.company { 
    requires jdk.incubator.httpclient; 
} 

तरह लग रहा है लेकिन मैं java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient

मिलता और मैं डॉन ' वास्तव में क्यों समझ में नहीं आता है। मेरा जावा संस्करण "9-एए + 16 9" बनाएं और मैं इंटेलिजे विचार (2017.1.3) के नवीनतम संस्करण का उपयोग करता हूं। मैंने this उत्तर में देखा और ऐसा लगता है कि मुझे सिर्फ एक फ़ाइल में आवश्यकता जोड़नी है, लेकिन यह किसी कारण से काम नहीं करती है।

+4

@QBrute ** मॉड्यूल ** 'jdk.incubator.httpclient' में ** पैकेज **' jdk.incubator.http' है, http://download.java.net/java/jdk9/docs/ देखें api/jdk.incubator.httpclient-summary.html –

+0

@MarkRotteveel हाँ, आप सही हैं। मेरी गलती। – QBrute

उत्तर

6

मेरे लिए ठीक काम करता है अगर मैं --add-modules jdk.incubator.httpclient स्टार्ट-अप पैरामीटर के रूप में उपयोग करता हूं।

HttpClient client = HttpClient.newHttpClient(); 
client.executor().execute(() -> System.out.println("Here")); // prints Here 

यदि आप कहते हैं कि आपके मॉड्यूल की आवश्यकता है, तो इसका मतलब यह नहीं होगा; इसमें डिफ़ॉल्ट रूप से शामिल नहीं है।

+0

बहुत बहुत धन्यवाद! क्या मॉड्यूल को स्वचालित रूप से शामिल करने का कोई तरीका है? – EmberTraveller

+1

@EmberTraveller निकोलई का उत्तर ऐसा लगता है कि जब मॉड्यूल ऊष्मायन से बाहर आता है, तो आपको '-ड-मॉड्यूल' की आवश्यकता नहीं होगी। –

+1

@ निकोलई आपके उत्तर पढ़ने के बाद मैं और अधिक सहमत नहीं हो सकता! – Eugene

7

या तो आप या इंटेलिजे ने गलती की होनी चाहिए।

इनक्यूबेटर मॉड्यूल JDK रन-टाइम मानक JDK निर्माण द्वारा उत्पादित छवि का हिस्सा हैं: आप एक incubator module है, जो के बारे में दस्तावेज़ कहते हैं का उपयोग कर रहे हैं। हालांकि, इनक्यूबेटर मॉड्यूल को कक्षा पथ पर अनुप्रयोगों के लिए डिफ़ॉल्ट रूप से हल नहीं किया जाता है। इनक्यूबेटर मॉड्यूल को हल करने का अनुरोध करने के लिए कक्षा पथ पर अनुप्रयोगों को --add-modules कमांड-लाइन विकल्प का उपयोग करना चाहिए। मॉड्यूल के रूप में विकसित अनुप्रयोग सीधे इनक्यूबेटर मॉड्यूल पर requires या requires transitive निर्भरता निर्दिष्ट कर सकते हैं।

मैं सिर्फ java-9-ea+169 पर उस व्यवहार की पुष्टि की है, यानी मैं संकलन और अतिरिक्त झंडे के बिना (कमांड लाइन से) इस तरह के एक मॉड्यूल शुरू कर सकते हैं।

तथ्य यह है कि आपको संकलन त्रुटि नहीं मिलती है यह इंगित करता है कि इंटेलिजे में संकलन में मॉड्यूल घोषणा सही ढंग से शामिल है। तथ्य यह है कि आपको रन-टाइम त्रुटि मिलती है और this answer यह इंगित करता है कि JVM आपके द्वारा मॉड्यूल के रूप में लॉन्च किए गए कोड को नहीं देखता है।

1

मैं एक ही समस्या है

java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient

java-9-ea+173 और इंटेलीजे साथ

में फंस गयी। मैं jdk.incubator.httpclient MacOS पर भागो/डीबग विन्यास में --add-modules jdk.incubator.httpclient के माध्यम से मॉड्यूल पथ के लिए स्पष्ट रूप से जोड़ने के लिए (Eugenes और Nicolais सलाह का पालन: Menu Bar -> Run -> Edit Configurations -> Configuration Tab -> VM Options -> --add-modules jdk.incubator.httpclient

enter image description here

उसके बाद सब कुछ ठीक काम किया बेशक आप में निर्भरता को जोड़ने के लिए है। module-info.java इस तरह के रूप में कहा से पहले:

module network { 
    requires jdk.incubator.httpclient; 
} 

अद्यतन:

नवीनतम इंटेलिजे आईडीईए 2017.2 ईएपी 172.2953.9 के साथ, मुझे वीएम विकल्पों में --add-modules डालने की आवश्यकता नहीं है। यह सिर्फ बॉक्स से बाहर काम करता है।

+0

मेरी सलाह _not_.incubator.httpclient_ को जोड़ने के लिए _not_ थी- '-add-modules' के साथ क्योंकि दस्तावेज़ और कमांड लाइन प्रयोग इसे अनावश्यक मानते हैं। हो सकता है कि IntelliJ एक गलती करता है, यद्यपि। – Nicolai

+0

क्षमा करें, मैंने इसे गलत समझा। वैसे भी, अगर कोई पैरामीटर जोड़ता है तो इनक्यूबेटर मॉड्यूल लोड होता है। शायद यह वास्तव में एक IntelliJ बग है। मैं IntelliJ के साथ ServiceLoader के माध्यम से कक्षाओं को लोड करने में भी असमर्थ था। बस नहीं मिलेगा। कमांड लाइन पर यह काम किया। या तो IntelliJ अभी तक तैयार नहीं है या मैं कुछ गलत कर रहा हूँ। –

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