Java 关闭没有有效引用的loader.InputStreams
将sun application server 8.2升级到新的修补程序级别时发生异常,我不知道原因。以下是Servlet中的代码片段: 该文件确实存在于类路径上,在以前的补丁版本中,它工作得很好。但现在部署时会导致异常。堆栈跟踪:Java 关闭没有有效引用的loader.InputStreams,java,classloader,appserver,Java,Classloader,Appserver,将sun application server 8.2升级到新的修补程序级别时发生异常,我不知道原因。以下是Servlet中的代码片段: 该文件确实存在于类路径上,在以前的补丁版本中,它工作得很好。但现在部署时会导致异常。堆栈跟踪: [#|2010-04-14T16:43:48.208+0200|WARNING|sun-appserver-ee8.2|javax.enterprise.system.core.classloading|_ThreadID=11;|loader.InputStrea
[#|2010-04-14T16:43:48.208+0200|WARNING|sun-appserver-ee8.2|javax.enterprise.system.core.classloading|_ThreadID=11;|loader.InputStreams with no valid reference is closed
java.lang.Throwable
at com.sun.enterprise.loader.EJBClassLoader$SentinelInputStream.<init>(EJBClassLoader.java:1172)
at com.sun.enterprise.loader.EJBClassLoader.getResourceAsStream(EJBClassLoader.java:858)
at java.lang.Class.getResourceAsStream(Class.java:1998)
at a.package.TestServlet.init(TestServlet.java:44)
at javax.servlet.GenericServlet.init(GenericServlet.java:261)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:118)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1093)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:931)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4183)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4535)
at com.sun.enterprise.web.WebModule.start(WebModule.java:241)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:847)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:483)
at org.apache.catalina.startup.Embedded.start(Embedded.java:894)
at com.sun.enterprise.web.WebContainer.start(WebContainer.java:741)
at com.sun.enterprise.web.HttpServiceWebContainer.startInstance(HttpServiceWebContainer.java:963)
at com.sun.enterprise.web.HttpServiceWebContainerLifecycle.onStartup(HttpServiceWebContainerLifecycle.java:50)
at com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:300)
at com.sun.enterprise.server.PEMain.run(PEMain.java:308)
at com.sun.enterprise.server.PEMain.main(PEMain.java:221)
|#]
[#|| 2010-04-14T16:43:48.208+0200 |警告| sun-appserver-ee8.2 | javax.enterprise.system.core.classloading | u ThreadID=11;|关闭没有有效引用的loader.InputStreams
java.lang.Throwable
在com.sun.enterprise.loader.EJBClassLoader$SentinelInputStream。(EJBClassLoader.java:1172)
在com.sun.enterprise.loader.EJBClassLoader.getResourceAsStream(EJBClassLoader.java:858)上
在java.lang.Class.getResourceAsStream(Class.java:1998)
位于a.package.TestServlet.init(TestServlet.java:44)
位于javax.servlet.GenericServlet.init(GenericServlet.java:261)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:592)
位于org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
位于java.security.AccessController.doPrivileged(本机方法)
位于javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
位于org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
位于org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
位于org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:118)
位于org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1093)
位于org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:931)
位于org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4183)
位于org.apache.catalina.core.StandardContext.start(StandardContext.java:4535)
位于com.sun.enterprise.web.WebModule.start(WebModule.java:241)
位于org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
位于org.apache.catalina.core.StandardHost.start(StandardHost.java:847)
位于org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
位于org.apache.catalina.core.StandardEngine.start(StandardEngine.java:483)
位于org.apache.catalina.startup.Embedded.start(Embedded.java:894)
位于com.sun.enterprise.web.WebContainer.start(WebContainer.java:741)
位于com.sun.enterprise.web.HttpServiceWebContainer.startInstance(HttpServiceWebContainer.java:963)
在com.sun.enterprise.web.HttpServiceWebContainerLifecycle.onStartup(HttpServiceWebContainerLifecycle.java:50)
位于com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:300)
位于com.sun.enterprise.server.PEMain.run(PEMain.java:308)
位于com.sun.enterprise.server.PEMain.main(PEMain.java:221)
|#]
我不知道会有什么问题有人知道吗?
(注意,我更改了代码和stacktrace中的一些名称)您确定它会引发异常吗?我们在玻璃鱼身上一直收到这样的警告。EJBClassLoader使用throwable转储堆栈跟踪,因此您可能会觉得它是一个异常
EJBClassLoader使用Sentinel包装所有流。此警告只是告诉您流未关闭。你可以放心地忽略它。要消除警告,您必须在使用流后关闭它。您应该始终在使用以下命令后关闭inputstreams:
public void init() throws ServletException {
InputStream str = null;
Properties reqProperties = new Properties();
try {
str = this.getClass().getResourceAsStream("/someFile.properties");
reqProperties.load(str);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (str != null) {
try {
str.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
顺便说一句,使用apache commons/io可以简化finally子句:
finally {
IOUtils.closeQuietly(str);
}
finally {
IOUtils.closeQuietly(str);
}