В чем разница между этими библиотеками JSTL в контексте Jetty? - PullRequest
0 голосов
/ 05 мая 2019

Конфликт часто возникающих проблем с поддержкой JSP-приложения с поддержкой JSTL - это множество библиотек JSTL с одинаковыми именами. Выражается в нотации Gradle (хотя эта проблема не относится к Gradle),

// https://bintray.com/bintray/jcenter/org.eclipse.jetty%3Aapache-jstl
implementation 'org.eclipse.jetty:apache-jstl:9.4.15.v20190215'

// https://bintray.com/bintray/jcenter/javax.servlet.jsp.jstl%3Ajavax.servlet.jsp.jstl-api
implementation 'javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.2'

// https://bintray.com/bintray/jcenter/javax.servlet.jsp.jstl%3Ajstl-api
implementation 'javax.servlet.jsp.jstl:jstl-api:1.2-rev-1'

// https://bintray.com/bintray/jcenter/javax.servlet.jsp.jstl%3Ajstl
implementation 'javax.servlet.jsp.jstl:jstl:1.2'

// https://bintray.com/bintray/jcenter/javax.servlet%3Ajstl
implementation 'javax.servlet:jstl:1.2'

// https://bintray.com/bintray/jcenter/jstl%3Ajstl
implementation 'jstl:jstl:1.2'

Это идеальное минное поле для новичка в JEE. wiki затрагивает три из них, идентифицируя jstl:jstl и javax.servlet.jsp.jstl:jstl как плохие и рекомендуя javax.servlet:jstl, но в нем не упоминаются первые три.

На моей установке Jetty 9 я вижу только следующие jar с "jstl" в названии:

/usr/share/java/jetty9-apache-jstl.jar
/usr/share/java/jetty9-apache-jstl-9.4.15.v20190215.jar
/usr/share/maven-repo/org/eclipse/jetty/apache-jstl/9.4.15.v20190215/apache-jstl-9.4.15.v20190215.jar
/usr/share/maven-repo/org/eclipse/jetty/apache-jstl/debian/apache-jstl-debian.jar

... и тем не менее JSTL все равно работает, когда на него развернута WAR, которая имеет ссылку на org.eclipse.jetty:apache-jstl:9.4.15.v20190215 и не имеет ссылки на javax.servlet:jstl:1.2.

Когда я уменьшаю свои зависимости до

dependencies {
    // Bundled in Ubuntu's libjetty9-java so not embedded
    compileOnly 'org.eclipse.jetty:apache-jsp:9.4.15.v20190215'

    // todo - This should not need to be 'implementation'
    // when hosted in Jetty, this alone is enough to support JSTL
    // in Gretty, this isn't enough
    implementation 'org.eclipse.jetty:apache-jstl:9.4.15.v20190215'
}

gradlew dependencies показывает:

runtimeClasspath - Runtime classpath of source set 'main'.
+--- javax.servlet:javax.servlet-api:3.1.0
+--- javax.websocket:javax.websocket-api:1.0
\--- org.eclipse.jetty:apache-jstl:9.4.15.v20190215
     +--- org.apache.taglibs:taglibs-standard-spec:1.2.5
     \--- org.apache.taglibs:taglibs-standard-impl:1.2.5

Рассмотрение того, что Apache JAR показывает, что они сделали некоторую переупаковку - taglibs-standard-spec-1.2.5.jar фактически содержит классы для javax.servlet.jsp.jstl.

Что здесь происходит? Почему рекомендуемый javax.servlet:jstl там не нужен? И в более широком смысле, какова точная разница между этими шестью библиотеками в списке?

...