2017-05-18 25 views
7

więc chcę spróbować klienta HTTPJava 9 nie jest wyjątkiem definicja klasy

package com.company; 

import jdk.incubator.http.HttpClient; 

public class Main { 

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

    } 
} 

A mój moduł informacji wygląda to

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

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

I don” t naprawdę rozumiem, dlaczego. Moja wersja java to "build 9-ea + 169" i korzystam z najnowszej wersji IntelliJ (2017.1.3). Zajrzałem do odpowiedzi this i wygląda na to, że muszę dodać wymaganie do pliku, ale z jakiegoś powodu nie działa.

+4

@QBrute ** moduł ** 'jdk.incubator.httpclient' zawiera ** pakiet **' jdk.incubator.http', patrz http://download.java.net/java/jdk9/docs/ api/jdk.incubator.httpclient-summary.html –

+0

@MarkRotteveel Tak, masz rację. Mój błąd. – QBrute

Odpowiedz

6

działa dobrze dla mnie, jeśli użyję --add-modules jdk.incubator.httpclient jako parametru początkowego.

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

Jeśli mówisz, że twój moduł tego wymaga, nie oznacza to, że zostanie uwzględniony; nie jest domyślnie uwzględniony.

+0

Dziękuję bardzo! Czy istnieje sposób automatycznego włączenia modułów? – EmberTraveller

+1

@EmberTraveller Odpowiedź Nicolai wydaje się sugerować, że gdy moduł wyjdzie z inkubacji, nie będziesz potrzebować '-add-modules'. –

+1

@Nicolai po przeczytaniu odpowiedzi Nie mogę się zgodzić więcej! – Eugene

7

Albo Ty, albo IntelliJ popełnili błąd. Używasz incubator module, o którym mówi dokumentacja:

moduły Inkubatory są częścią JDK uruchomić w czasie obrazu wytwarzanego przez standardowy build JDK. Jednak moduły inkubatora nie są domyślnie rozpoznawane dla aplikacji na ścieżce klasy. Aplikacje na ścieżce klasy muszą użyć opcji wiersza polecenia, aby zażądać rozwiązania modułu inkubatora. Aplikacje opracowane jako moduły mogą bezpośrednio określać zależności zależne od modułu inkubatora.

Właśnie potwierdziłem to zachowanie na java-9-ea+169, tj. Mogę skompilować i uruchomić taki moduł (z wiersza poleceń) bez dodatkowych flag.

Fakt, że nie występuje błąd kompilacji, wydaje się wskazywać, że IntelliJ poprawnie zawiera deklarację modułu w kompilacji. Fakt, że pojawi się błąd czasu wykonania i informacja, że ​​this answer pomogły wskazać, że maszyna JVM nie widzi kodu uruchamianego jako moduł.

1

wpadłem na tych samych problemów

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

z java-9-ea+173 i IntelliJ. Śledziłem Eugenes i porady Nicolais dodać jdk.incubator.httpclient wprost na ścieżkę modułu poprzez --add-modules jdk.incubator.httpclient w Run/Debug konfiguracje (na MacOS: Menu Bar -> Run -> Edit Configurations -> Configuration Tab -> VM Options -> --add-modules jdk.incubator.httpclient

enter image description here

Po tym wszystko działało w porządku Oczywiście trzeba dodać zależność do. module-info.java tak jak powiedziałem wcześniej:

module network { 
    requires jdk.incubator.httpclient; 
} 

UPDATE:

Z najnowszym IntelliJ IDEA 2017.2 EAP 172.2953.9, nie muszę wstawiać --add-modules do Opcji VM. To po prostu działa po wyjęciu z pudełka.

+0

Moja rada była _nie_ dodawać _jdk.incubator.httpclient_ z '--add-modules', ponieważ eksperymenty z dokumentacją i wierszem poleceń pokazują, że nie jest to konieczne. Możliwe, że IntelliJ popełnia błąd. – Nicolai

+0

Przepraszam, źle to zrozumiałem. W każdym razie moduł inkubatora jest ładowany, jeśli doda się parametr. Może to naprawdę błąd IntelliJ. Nie mogłem też załadować klas za pomocą ServiceLoadera z IntelliJ. Po prostu nie będzie można znaleźć. W linii poleceń zadziałało. Albo IntelliJ nie jest jeszcze gotowy, albo robię coś nie tak. –