2017-05-18 26 views
7

Vì vậy, tôi muốn thử client httpJava 9 không có định nghĩa lớp ngoại lệ

package com.company; 

import jdk.incubator.http.HttpClient; 

public class Main { 

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

    } 
} 

Và thông tin mô-đun của tôi trông như thế này

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

Nhưng tôi nhận được java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient

Và tôi don' t thực sự hiểu tại sao. Phiên bản java của tôi là "xây dựng 9-ea + 169" và tôi sử dụng phiên bản mới nhất của ý tưởng IntelliJ (2017.1.3). Tôi nhìn vào câu trả lời this và có vẻ như tôi chỉ cần thêm yêu cầu vào một tệp, nhưng nó không hoạt động vì một lý do nào đó.

+4

@QBrute ** module ** 'jdk.incubator.httpclient' chứa gói ** ** jdk.incubator.http', xem http://download.java.net/java/jdk9/docs/ api/jdk.incubator.httpclient-summary.html –

+0

@MarkRotteveel Vâng, bạn nói đúng. Lỗi của tôi. – QBrute

Trả lời

6

hoạt động tốt cho tôi nếu tôi sử dụng --add-modules jdk.incubator.httpclient làm tham số khởi động.

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

Nếu bạn nói rằng mô-đun của bạn yêu cầu, không có nghĩa là nó sẽ được bao gồm; nó không được bao gồm theo mặc định.

+0

Cảm ơn bạn rất nhiều! Có cách nào để tự động bao gồm các mô-đun không? – EmberTraveller

+1

@EmberTraveller Trả lời của Nicolai có vẻ ngụ ý rằng khi mô-đun ra khỏi ủ, bạn sẽ không cần '--add-modules'. –

+1

@Nicolai sau khi đọc câu trả lời của bạn Tôi không thể đồng ý nhiều hơn nữa! – Eugene

7

Hoặc bạn hoặc IntelliJ chắc chắn đã phạm sai lầm. Bạn đang sử dụng một số incubator module, về tài liệu nào nói:

Mô-đun lồng ấp là một phần của hình ảnh thời gian chạy JDK được tạo bởi bản dựng JDK chuẩn. Tuy nhiên, mô-đun lồng ấp không được giải quyết theo mặc định cho các ứng dụng trên đường dẫn lớp. Các ứng dụng trên đường dẫn lớp phải sử dụng tùy chọn dòng lệnh --add-modules để yêu cầu giải quyết mô-đun lồng ấp. Các ứng dụng được phát triển dưới dạng mô-đun có thể chỉ định trực tiếp phụ thuộc requires hoặc requires transitive trên mô-đun lồng ấp.

Tôi vừa xác nhận rằng hành vi trên java-9-ea+169, nghĩa là tôi có thể biên dịch và khởi chạy mô-đun như vậy (từ dòng lệnh) mà không cần thêm cờ.

Thực tế là bạn không nhận được một lỗi biên dịch dường như chỉ ra rằng IntelliJ chính xác bao gồm khai báo mô-đun trong biên dịch. Thực tế là bạn gặp lỗi thời gian chạy và rằng this answer đã giúp chỉ ra rằng JVM không thấy mã bạn khởi chạy làm mô-đun.

1

Tôi chạy vào những vấn đề tương tự

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

với java-9-ea+173 và IntelliJ. Tôi đi theo Eugenes và tư vấn Nicolais thêm jdk.incubator.httpclient một cách rõ ràng với các đường dẫn mô-đun qua --add-modules jdk.incubator.httpclient trong Run/Debug Configurations (trên hệ điều hành MacOS: Menu Bar -> Run -> Edit Configurations -> Configuration Tab -> VM Options -> --add-modules jdk.incubator.httpclient

enter image description here

Sau đó tất cả mọi thứ đã làm việc tốt Tất nhiên bạn phải thêm phụ thuộc vào. các module-info.java như thế này như đã nói trước:

module network { 
    requires jdk.incubator.httpclient; 
} 

CẬP NHẬT:

Với IntelliJ IDEA 2017.2 EAP 172.2953.9 mới nhất, tôi không cần phải đặt --add-modules vào Tùy chọn VM. Nó chỉ hoạt động ra khỏi hộp.

+0

Lời khuyên của tôi là _not_ để thêm _jdk.incubator.httpclient_ với '--add-modules' bởi vì tài liệu và các thử nghiệm dòng lệnh cho thấy nó là không cần thiết. Có thể là IntelliJ làm cho một sai lầm, mặc dù. – Nicolai

+0

Xin lỗi, tôi đã hiểu lầm điều đó. Dù sao, mô-đun lồng ấp được nạp nếu thêm tham số. Có lẽ nó thực sự là một lỗi IntelliJ. Tôi cũng không thể tải các lớp học thông qua ServiceLoader với IntelliJ. Chỉ sẽ không được tìm thấy. Trên dòng lệnh nó hoạt động. IntelliJ chưa sẵn sàng hoặc tôi đang làm điều gì sai. –

Các vấn đề liên quan