2016-11-08 3 views
3

私は自分のアプリケーションで以下のJ2EEの依存関係が含まれている場合、私は、サーブレットやJAX-RSクラスおよびインタフェースへのアクセスがあります。サーブレットとJAX-RSの依存関係はどこから来ますか?

<dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>7.0</version> 
    </dependency> 

しかし、彼らはから来ているの? Maven Centralで私はjavax:javaee-api:7.0が依存関係としてjavax:javaee-web-api:7.0を持っていることを確認しています。これは依存関係としてjavax.servlet:javax.servlet-api:3.1.0javax.ws.rs:javax.ws.rs-api:2.0を持っていますので、その答えです。

しかし、これらすべての依存関係が、私は明示的に含めない限り推移の依存関係として、彼らは私のプロジェクトのために現れないことを意味し、optionalとしてマークされています。しかし、私のプログラムは単にjavax:javaee-api:7.0に依存してコンパイルされます。どうして?

私の依存関係のツリーです。彼らが来ているところ私は表示されません。

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ temp-server --- 
[INFO] com.example:test-server:war:1.0.0-SNAPSHOT 
[INFO] +- com.google.code.findbugs:jsr305:jar:3.0.1:provided 
[INFO] \- javax:javaee-api:jar:7.0:compile 
[INFO] \- com.sun.mail:javax.mail:jar:1.5.0:compile 
[INFO]  \- javax.activation:activation:jar:1.1:compile 

(これは、すべての基本的なものであり、私は混乱している理由を知らない私は何かを明らかに不足している必要があります。。)JAX-RS 2.0として

+0

あなたは特にどのクラスについて話していますか? –

答えて

1

Java EE 7の一部です。そのAPIを定義するクラスは、成果物javax:javaee-api:7.0に直接組み込まれているので、標準クラスのみを使用する限り、プログラムをコンパイルするだけで十分です。

+0

JAX-RSクラスは、例えば、 'javax:javaee-api:7.0'と' javax.ws.rs:javax.ws.rs-api:2.0'に重複していますか? (そして、誰かが依存関係管理をしていなかった場合にこれをしたと思います) –

+0

あなたは既に言及したように、それらは 'オプションの依存関係のみですので、私はそうは思わないでしょうが、とにかく'提供された 'それは本当に重要ではありません。私は 'javax.ws.rs:javax.ws.rs-api:2.0'は、純粋なJX-RSアプリケーションを使っている人やコンパイルするための完全なAPIを望んでいない人が使うことを意図していると思います –

+0

" duplicated "つまり、JAX-RSの '.class'ファイルは' javax:javaee-api:7.0'と 'javax.ws.rs:javax.ws.rs-api:2.0'の両方に含まれていました。後者は依存関係です。それは私の質問に答えます。私は '.class'ファイルが両方のJARファイルにあるとは考えていませんでした。なぜなら、一方が他方の依存関係であるからです。それを指摘してくれてありがとう。 –

1

ここでは、<scope>provided</scope>の意味を理解する必要があります。 とjavax.ws.rs:javax.ws.rs-api:2.0は、javaee-apiの依存関係を含めると、providedというスコープに含まれます。これはつまり、のみのクラスをコンパイルしている間に、これらのjarファイルが使用され、実行時にでないことを意味します。スコープはprovidedなので、これらの2つのjarファイルは実行時環境によって提供されると予想されます。再実行するには、スコープがprovidedのjarが含まれている場合は、このjarをコンパイルに使用する必要がありますが、実行時にはランタイム・コンテナによって提供されることを意味します。

質問に答えるには、JBOSS,WASなどのランタイム環境のコンテナを考慮すると、すべてこれらのjarにバンドルされています。したがって、クラスをコンパイルするときに、javaee-apiに推移的な依存関係となるjarを使用しますが、実行時にコンテナにバンドルされたjarファイルを使用します。したがって、エラーは発生しません。

+0

私は ''を提供していますが、これは完全に質問の横にあります。この質問は「」に関するものです。それは実行時ではなくコンパイル時の依存関係でした。質問を読んでください。あなたの答えはとても良かった---別の質問のために。 –

+0

@Garett、あなたのアプリケーションでこれらのオプションのjarのクラスを使用していますか? –

+0

これは、私のコンパイラが 'javax.ws.rs:javax.ws.rs-api:2.0'のファイルをどのように見ているかを調べるための質問に過ぎませんでした。 :javaee-api:7.0'。その答え(Nicolas Filottoによって与えられる)は、関連するクラスが 'javax:javaee-api:7.0'に含まれているので、それらは推移的に含まれていませんでした。私はJAX-RSクラスが他のJAX-RSクラスを参照しているにもかかわらず、両方のJAX-RSクラスがJAX-RSに含まれるかもしれないと考えることができなかったので、良いモジュール化に慣れています。物語の終わり。質問に答えました。 –

関連する問題