2016-11-08 5 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.0 и javax.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 

(Это все основные вещи, я не знаю, почему я запутался я должен быть отсутствующий что-то очевидное.).

+0

В каком классе, в частности, вы говорите? –

ответ

1

Как JAX-RS 2.0 является частью 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 » Я имею в виду, что Java включала файлы JAX-RS '.class' как в javax: javaee-api: 7.0, так и в' javax.ws.rs: javax.ws.rs-api: 2.0', хотя первая включает последнее как зависимость. Это отвечает на мой вопрос; Я не считал, что файлы '.class' будут находиться в обоих файлах JAR, потому что одна из них является зависимостью другого. Спасибо что подметил это. –

1

Здесь вы должны понимать, что имеется в виду под номером <scope>provided</scope>. javax.servlet:javax.servlet-api:3.1.0 и javax.ws.rs:javax.ws.rs-api:2.0 будут включены в объем как provided при включении зависимости javaee-api. Это означает, что ТОЛЬКО при компиляции ваших классов, эти файлы jar будут использоваться и NOT во время выполнения. Поскольку область составляет provided, она ожидает, что эти 2 баночки будут предоставлены средой выполнения. Для повторного итерации, когда любая банка включена в область как provided, это означает, что этот банку следует использовать для компиляции, но для среды выполнения он ожидает предоставления контейнера времени выполнения.

Теперь, чтобы ответить на ваш вопрос, если вы рассматриваете какой-либо контейнер среды выполнения, такой как JBOSS, WAS и т. Д., Все они поставляются вместе с этими банками. Поэтому во время компиляции ваших классов он будет использовать банки, которые поступают как транзитивные зависимости в javaee-api, но во время выполнения он будет использовать банки, которые поставляются вместе с контейнером. Следовательно, вы не получаете никаких ошибок.

+0

Понятно, что « предоставил', но это совершенно не относится к вопросу. Этот вопрос касался ''. И речь шла о времени компиляции, а не о времени выполнения.Пожалуйста, перечитайте вопрос. Ваш ответ был очень хорошим - для другого вопроса. –

+0

@Garett, вы используете какие-либо классы из этих дополнительных банок в своем приложении? –

+0

Это был всего лишь вопрос, чтобы узнать, как мой компилятор видел файлы в javax.ws.rs: javax.ws.rs-api: 2.0, которые были переданы транзитно (но с использованием 'optional') двух слоев вниз из' javax : JavaEE-апи: 7.0'. Ответ (данный Николасом Филотто) заключается в том, что соответствующие классы также включены в 'javax: javaee-api: 7.0', поэтому они не были включены транзитивно. Я настолько привык к хорошей модуляции, что не смог учесть, что классы JAX-RS могут быть включены в баннеры _both_, хотя один из них ссылается на другой. Конец истории. Вопрос ответил. –