我正在尝试运行一个非常简单的嵌入了jetty的java服务器。 我正在使用 gradle 来编译它,但为了简单起见,我将只描述我尝试启动进程的方式
start.bat
com
test
worktest
Starter.class
WebServer.class
./lib:
asm-3.2.jar
cglib-nodep-2.2.jar
ecj-3.12.3.jar
gentyref-1.2.0.jar
gson-2.8.2.jar
javax.servlet-api-3.1.0.jar
jetty-http-9.4.8.v20171121.jar
jetty-io-9.4.8.v20171121.jar
jetty-jsp-2.1-7.5.4.v20111024.jar
jetty-security-9.4.8.v20171121.jar
jetty-server-9.4.8.v20171121.jar
jetty-servlet-9.4.8.v20171121.jar
jetty-util-9.4.8.v20171121.jar
jetty-webapp-9.4.8.v20171121.jar
jetty-xml-9.4.8.v20171121.jar
mockachino-0.6.2.jar
objenesis-1.2.jar
slf4j-api-1.7.25.jar
slf4j-simple-1.6.2.jar
tomcat-api-9.0.5.jar
tomcat-el-api-9.0.5.jar
tomcat-jasper-9.0.5.jar
tomcat-jasper-el-9.0.5.jar
tomcat-jsp-api-9.0.5.jar
tomcat-juli-9.0.5.jar
tomcat-servlet-api-9.0.5.jar
tomcat-util-9.0.5.jar
tomcat-util-scan-9.0.5.jar
./web:
index.jsp
./web/js:
jquery-1.7.1.min.js
start.bat 看起来像这样
cat start.bat
set JAVA_STARTER="com.test.worktest.Starter"
set CLASSPATH=".\lib\*;."
java -cp %CLASSPATH% %JAVA_STARTER%
服务器启动得很好,但是当我尝试访问 localhost:port 时,我得到了
Problem accessing /index.jsp. Reason:
JSP support not configured
我使用的是jdk 9.0.1。
第 2 部分
根据下面的答案,我对我的 gradle 脚本做了一些更改。摆脱了不兼容的部门。
我还发现asm3.0是mockachino的一个dep。现在已经消失了。目前我看起来像:
dependencies {
compile 'com.google.code.gson:gson:2.8.2'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
runtime group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
compile group: 'org.eclipse.jetty', name: 'jetty-http', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-webapp', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'apache-jsp', version: '9.4.8.v20171121'
compile group: 'org.eclipse.jetty', name: 'jetty-annotations', version: '9.4.8.v20171121'
compile 'javax.servlet:javax.servlet-api:3.1.0'
testCompile group: 'se.mockachino', name: 'mockachino', version: '0.6.2'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
和我的 lib 文件夹:
apache-el-8.5.23.jar
apache-jsp-8.5.23.jar
apache-jsp-9.4.8.v20171121.jar
asm-6.0.jar
asm-commons-6.0.jar
asm-tree-6.0.jar
ecj-3.12.3.jar
gson-2.8.2.jar
javax.annotation-api-1.2.jar
javax.servlet-api-3.1.0.jar
jetty-annotations-9.4.8.v20171121.jar
jetty-http-9.4.8.v20171121.jar
jetty-io-9.4.8.v20171121.jar
jetty-jndi-9.4.8.v20171121.jar
jetty-plus-9.4.8.v20171121.jar
jetty-schemas-3.1.jar
jetty-security-9.4.8.v20171121.jar
jetty-server-9.4.8.v20171121.jar
jetty-servlet-9.4.8.v20171121.jar
jetty-util-9.4.8.v20171121.jar
jetty-webapp-9.4.8.v20171121.jar
jetty-xml-9.4.8.v20171121.jar
slf4j-api-1.7.25.jar
slf4j-simple-1.7.25.jar
当访问jsp时我仍然得到:
- java.lang.IllegalStateException:ServletContext 中未设置 org.apache.tomcat.InstanceManager
- org.apache.jasper.JasperException:无法编译 JSP 类
代码是here
当我发现问题时,我会继续发布更新。
最佳答案
您必须为 Jetty 设置 JSP,仅存在 JAR 是不够的。
应从您的项目中删除以下 JAR。
jetty-jsp-2.1-7.5.4.v20111024.jar
tomcat-api-9.0.5.jar
tomcat-el-api-9.0.5.jar
tomcat-jasper-9.0.5.jar
tomcat-jasper-el-9.0.5.jar
tomcat-jsp-api-9.0.5.jar
tomcat-juli-9.0.5.jar
tomcat-servlet-api-9.0.5.jar
tomcat-util-9.0.5.jar
tomcat-util-scan-9.0.5.jar
jetty-jsp
对于 Jetty 9.4.8 无效。
直接/普通/默认 Tomcat 库在 Jetty 内 100% 不兼容。
Important: For success with JSP, Use a proper build system (choose one of the following: maven, ant+ivy, buildr, grails, grape, sbt, or leiningen). Don't skip this, don't work around this, don't try to do it manually.
使用正确的 servlet-api
jar。
http://search.maven.org/#artifactdetails%7Cjavax.servlet%7Cjavax.servlet-api%7C3.1.0%7Cjar
如果您要部署到 JDK,或者打算在 JSP 中使用 Java 1.7(或更高版本)功能,请删除 ecj-3.12.3.jar
。默认情况下,将使用 JDK 编译器(如果存在)。不要忘记在 JettyJspServlet
配置中配置您所需的源/目标级别。
确保您使用适用于 Jetty 9.4.8 的有效 ASM jar。
删除它,因为它不兼容:
asm-3.2.jar
确保您使用来自 org.eclipse.jetty
组 ID 的 jetty-annotations
工件(和临时依赖项),与其余部分的版本一致你的 jetty 文物。
这将引入您的 JSP Web 应用程序所需的正确的 asm jar 和适当的依赖项。
您需要来自 org.eclipse.jetty
组 ID 的 apache-jsp
工件(和临时依赖项),与其余部分的版本保持一致你的 jetty 文物。
http://search.maven.org/#artifactdetails%7Corg.eclipse.jetty%7Capache-jsp%7C9.4.8.v20171121%7Cjar
这将引入您需要的正确的 JSP 支持库(和 JSTL/EL)。
然后您需要配置 JSP。
查看示例项目 https://github.com/jetty-project/embedded-jetty-jsp
最后,JSP/JSTL/EL 支持需要考虑的一些事项:
- 不要在 OSGi 中捆绑(JSTL/EL/Standard 库不支持这种用法。主要是由于类加载器的期望)
- 不要使用 Java 9+ JPMS 模块(JSTL/EL/Standard 库不支持这种用法,主要是由于类加载器期望和资源 URL 期望)
- 不要创建 uber jar(JSTL/EL/Standard 库不支持此功能)
- 不要以任何方式重新打包 JSTL jar,它们需要保留为文件系统上可用的 JSTL/EL/Standard jar。
- 不要创建自定义类加载器。 (JSTL/EL/标准库期望类加载器的定义非常狭窄)
关于java - jetty嵌入jsp问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48928954/