2013-12-16 3 views
3

Я использую Gradle 1.9 (подробности ниже), чтобы построить WAR, который будет работать над Jetty 9 (jetty-9.0.5.v20130815).Gradle создает войну с servlet-api 2.5 вместо 3.0.1

Он настраивается в web.xml -

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://java.sun.com/jsp/jstl/core" 
xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
... 

build.gradle имеет эту зависимость -

repositories { 
    mavenCentral() 
} 
dependencies { 
    providedCompile 'javax.servlet:javax.servlet-api:3.0.1' 
    compile 'org.springframework:spring-webmvc:3.2.2.RELEASE' 
    compile 'javax.mail:mail:1.4.7' 
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13' 
    compile 'org.apache.directory.studio:org.apache.commons.io:2.4' 
    compile 'commons-net:commons-net:3.3' 
    compile 'mysql:mysql-connector-java:5.1.26' 
    compile 'org.springframework:spring-jdbc:3.2.4.RELEASE' 
    compile 'commons-fileupload:commons-fileupload:1.3' 
    compile 'commons-pool:commons-pool:1.6' 
    compile 'commons-dbcp:commons-dbcp:1.4' 
    compile 'log4j:log4j:1.2.17' 
    compile 'org.slf4j:slf4j-api:1.7.5' 
    compile 'org.slf4j:slf4j-log4j12:1.7.5' 
    runtime 'javax.servlet:jstl:1.1.2' 
} 

здание с использованием gradle clean war производит WAR файл с servlet-api-2.5.jar в WEB-INF/lib/.

Подробнее Env -

Build time: 2013-11-19 08:20:02 UTC 
Build number: none 
Revision:  7970ec3503b4f5767ee1c1c69f8b4186c4763e3d 

Groovy:  1.8.6 
Ant:   Apache Ant(TM) version 1.9.2 compiled on July 8 2013 
Ivy:   2.2.0 
JVM:   1.7.0_45 (Oracle Corporation 24.45-b08) 
OS:   Mac OS X 10.9 x86_64 

веб-приложение, кажется, работает без servlet-api-2.5.jar (удалено вручную), но я не проверил все функции доступны.

Является ли это зависимостью от другой библиотеки? Это плохо?

+0

ли ваш 'WEB-INF/web.xml' указать Servlet API 2.5? или 3,0? –

+0

Да, добавлен конфиг вопроса. – Kof

ответ

11

Вы можете запускать зависимости отчет, чтобы увидеть, какая библиотека тянет в сервлет-Апи-2.5:

gradle dependencies --configuration runtime 

После того, как вы знаете, какая библиотека тянет в сервлет-Апи-2.5, у вас есть два варианта:

Отключение транзитивных зависимостей для библиотеки:

runtime('org.hibernate:hibernate:3.0.5') { 
    transitive = false 
} 
runtime group: 'org.hibernate', name: 'hibernate', version: '3.0.5', transitive: false 

Исключить особую переходную зависимость:

compile('org.hibernate:hibernate:3.1') { 
    //excluding a particular transitive dependency: 
    exclude module: 'cglib' //by artifact name 
    exclude group: 'org.jmock' //by group 
    exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group 
} 

Если вам интересно, почему этот конфликт не был разрешен Gradle автоматически, это происходит потому, что 2,5 и 3,0 имеют разные названия:

javax.servlet:servlet-api:2.5 
javax.servlet:javax.servlet-api:3.0.1 

Надеется, что это помогает.

Update:

Я смотрел на 'javax.servlet: JSTL: 1.1.2', это зависит от 'javax.servlet: JSP-апи: 2,0', который зависит от «javax.servlet: сервлет-апи: 2,4'

+0

Отчет о зависимостях сделал прорыв. Оказывается, что один из моих подпроектов имел эту зависимость, после устранения проблемы. Благодаря! – Kof

+0

Что меня смутило, так это то, что, если градлее тянет в зависимости от какой-либо другой (и более старой) ссылки на библиотеку, зависимости по-прежнему отображаются для новейшей версии библиотеки, хотя это может быть тот, который вы явно объявили транзитивным: false – Tom

0

В более поздних версиях Gradle вы можете использовать module replacement:

dependencies { 
    modules { 
     module("javax.servlet:servlet-api") { 
      replacedBy("javax.servlet:javax.servlet-api") 
     } 
    } 
} 
Смежные вопросы