jetty 错误 java.err.nojdk处理,兼论jdk环境变量配置

本文详细解析了在使用Jetty服务器运行JSP时遇到的java.err.nojdk错误,该问题源于系统环境变量中存在JRE而非JDK。文章提供了两种解决方案:一是删除Windows系统32位目录下的JRE相关文件,二是调整JAVA_HOME环境变量的位置,确保其在PATH变量中处于首位,以避免系统误用JRE。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Caused by:

org.apache.jasper.JasperException: java.err.nojdk
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:89)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:375)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:116)
at org.apache.jasper.compiler.Jsr199JavaCompiler.compile(Jsr199JavaCompiler.java:198)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:364)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:433)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:476)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:366)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:445)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:574)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:293)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:120)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:572)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:445)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:556)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1044)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:372)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:978)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:369)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:486)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:933)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:995)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Unknown Source)

 

原因是:jetty运行需要jdk,而我们平时安装jdk时,安装程序会向windows/system32/中拷贝三个文件:java.exe,javaw.exe,javaws.exxe,而这三个文件是jre的东西,不是jdk的东西,这将导致我们实际用的是jre(system32是默认环境变量其中的程序优先级比我们配置的jdk的环境变量高——这个可能是因为配置的jdk的path路径放在system32之后,这里可以引出第二种处理方法。)

解决方案1:删除这三个文件就行了。

解决方案2(未验证):环境变量JAVA_HOME的配置放在path路径中的最前面,注意要用英文分号“;”分隔,这样查找jdk时其优先级最高。这可能也是一般推荐JAVA_HOME配置放在path路径最前面的原因,避免有旧的或者其他非预期的jdk路径影响jdk配置的原因。

 

参考:https://blog.youkuaiyun.com/as_jopo/article/details/41487141

### 如何在 Java 中设置 DNS 的 TTL 值 在 Java 中,DNS 缓存的时间由 JVM 控制,默认情况下,DNS 查询的结果会被永久缓存在 JVM 生命周期内[^3]。为了更改这一行为,可以通过配置系统属性来动态调整 DNS 缓存的 TTL(Time To Live)。以下是具体方法: #### 方法一:通过命令行参数设置 在启动 JVM 时,可以传递 `-D` 参数来修改 `networkaddress.cache.ttl` 和 `networkaddress.cache.negative.ttl` 属性。 - **正向解析缓存时间** 使用 `networkaddress.cache.ttl` 来定义成功解析的 DNS 记录在缓存中的存活时间(单位为秒),将其设为所需的值即可。例如,将 TTL 设为 60 秒: ```bash java -Dsun.net.inetaddr.ttl=60 -jar your-application.jar ``` - **负向解析缓存时间** 对于失败的 DNS 解析记录,可使用 `networkaddress.cache.negative.ttl` 定义其缓存时间。同样,将其设为期望值。例如,禁用负向缓存(即立即失效): ```bash java -Dsun.net.inetaddr.negative.ttl=0 -jar your-application.jar ``` 这些参数会在 JVM 启动时生效,并影响整个应用程序的行为[^4]。 --- #### 方法二:通过代码设置 如果无法通过命令行参数指定,则可以在程序中通过 `System.setProperty()` 动态设定上述两个属性。需要注意的是,这种做法必须在任何网络操作之前执行,否则可能不起作用[^4]。 以下是一个示例代码片段: ```java public class DNSTTLConfig { public static void main(String[] args) { // 设置正向解析缓存时间为 60 秒 System.setProperty("sun.net.inetaddr.ttl", "60"); // 禁用负向解析缓存 System.setProperty("sun.net.inetaddr.negative.ttl", "0"); try { InetAddress address = InetAddress.getByName("example.com"); System.out.println("Resolved IP: " + address.getHostAddress()); } catch (UnknownHostException e) { System.err.println("Failed to resolve host."); } } } ``` 注意,在某些容器化环境中(如 Tomcat 或 Jetty),由于容器本身的初始化过程可能会提前触发网络操作,因此这种方式可能不可靠[^4]。 --- #### 方法三:修改安全属性文件 对于需要长期稳定运行的应用场景,可以直接编辑 `$JAVA_HOME/lib/security/java.security` 文件,找到并修改如下两行内容: - 修改正向解析缓存时间: ``` networkaddress.cache.ttl=60 ``` - 修改负向解析缓存时间: ``` networkaddress.cache.negative.ttl=0 ``` 保存后重新启动 JVM 即可生效。不过,这种方法涉及对 JDK 配置文件的手动改动,需谨慎处理以避免引入安全隐患。 --- ### 总结 以上三种方式均可用于调整 Java 应用程序中的 DNS 缓存 TTL 值。推荐优先采用命令行参数的方式,因为它简单直观且不会污染全局配置;而在特殊需求下才考虑使用代码或直接修改安全属性文件的方法。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值