2017-05-18 6 views
7

だから私は、HTTPクライアントにJavaの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

を取得し、私はドンなぜ本当に理解していない。私のJavaバージョンは "build 9-ea + 169"で、IntelliJのアイデア(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 Nicolaiの回答は、モジュールがインキュベーションから外れると、 '--add-modules'は必要ないと考えているようです。 –

+1

@ニコライあなたの答えを読んだ後、私はもっと同意できません! – Eugene

7

あなたまたはIntelliJが間違っている必要があります。

インキュベータモジュールは、標準JDKビルドによって生成されたJDKランタイムイメージの一部です。ただし、クラスパスのアプリケーションの場合、インキュベータモジュールはデフォルトでは解決されません。インキュベーターモジュールの解決を要求するには、クラスパスのアプリケーションで--add-modulesコマンドラインオプションを使用する必要があります。モジュールとして開発されたアプリケーションは、インキュベータモジュールに直接依存することをrequiresまたはrequires transitiveと指定できます。

私はちょうどjava-9-ea+169の動作を確認しました。追加のフラグを付けずに(コマンドラインから)このようなモジュールをコンパイルして起動できます。

コンパイルエラーが発生しないという事実は、IntelliJがコンパイルにモジュール宣言を正しく含むことを示しているようです。ランタイムエラーが発生し、this answerが助けられたという事実は、JVMがあなたがモジュールとして起動したコードを見ないことを示しています。

1

私はjava-9-ea+173とのIntelliJと

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

同じ問題に遭遇しました。私はMacOSの上で(実行/デバッグの構成に--add-modules jdk.incubator.httpclient経由モジュールパスに明示的に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; 
} 

UPDATE

最新のIntelliJ IDEA 2017.2 EAP 172.2953.9では、--add-modulesをVMオプションに入れる必要はありません。それはちょうど箱の外で働く。

+0

ドキュメンテーションとコマンドラインの実験では不要であることがわかっているので、私の助言は_jdk.incubator.httpclient_を '--add-modules'で追加することはありませんでした。 IntelliJが間違っているかもしれない。 – Nicolai

+0

申し訳ありませんが、私はそれを誤解しました。とにかく、パラメータを追加するとインキュベータモジュールがロードされます。たぶんそれは本当にIntelliJのバグです。私はIntelliJでServiceLoader経由でクラスをロードすることもできませんでした。ちょうど見つからないでしょう。コマンドラインではうまくいきました。 IntelliJはまだ準備ができていないか、私は間違ったことをしています。 –

関連する問題