JSP class loader
Hi,
I have a static block within a JSP page that get executed twice when it's being executed!
Based on the output, you can see that it's being loaded by two separated class loaders:
'weblogic.utils.classloaders.RecursiveReloadOnModifyClassLoader$Slave' and 'weblogic.servlet.jsp.OneOffJspLoader'.
Can anyone shed some light on this issue? I can see that this might cause a lot
of problem if the logic relies on the static block only executing once.
thanks,
-vu
/** Code starts here **/
<%!
static
System.out.println("\n\nThis is the static block!!!!");
try {
System.out.println("Static classloader: " +
Class.forName("jsp_servlet._helloworld").getClassLoader().getClass().getName()
+ "\n\n");
catch (java.lang.ClassNotFoundException cne) { }
%>
<%
System.out.println("Hello World.");
System.out.println("Class name: " + this.getClass().getName());
System.out.println("Class loader: " +
page.getClass().getClassLoader().getClass().getName());
%>
/** code ends here **/
/** Program's Output to Stdout **/
This is the static block!!!!
Static classloader: weblogic.utils.classloaders.RecursiveReloadOnModifyClassLoader$Slave
This is the static block!!!!
Static classloader: weblogic.servlet.jsp.OneOffJspLoader
Hello World.
Class name: jsp_servlet._helloworld
Class loader: weblogic.servlet.jsp.OneOffJspLoader
/** End OUtput **/
Well, I wouldn't say expected - obviously this poster (and others)
don't expect it, and correct is debatable.
Why in the *&^%* is it necessary to load the class twice? And I
don't mean two hours apart either - when you hit a JSP for the
first time, it gets loaded twice - one right after the other.
This wastes time and memory. When the JVMs and WLS clusters are
failing (and they are) because of too much class loading - it is
a big problem.
Mike
"Cameron Purdy" <[email protected]> wrote:
>Don't rely on static code only being executed once. What
>you are seeing is
>not only legal, it is expected and correct behavior.
>
>BTW - don't put static blocks in your JSP page. Use lazy
>initializers that
>store the result in app scope if you have to.
>
>Peace,
>
>--
>Cameron Purdy
>Tangosol, Inc.
>http://www.tangosol.com
>+1.617.623.5782
>WebLogic Consulting Available
>
>
>"Vu Nguyen" <[email protected]> wrote in message
>news:[email protected]...
>>
>> Hi,
>>
>> I have a static block within a JSP page that get executed
>twice when it's
>being executed!
>> Based on the output, you can see that it's being loaded
>by two separated
>class loaders:
>> 'weblogic.utils.classloaders.RecursiveReloadOnModifyClassLoader$Slave'
>and
>'weblogic.servlet.jsp.OneOffJspLoader'.
>> Can anyone shed some light on this issue? I can see
>that this might
>cause a lot
>> of problem if the logic relies on the static block only
>executing once.
>>
>> thanks,
>> -vu
>>
>>
>>
>> /** Code starts here **/
>> <%!
>> static
>> {
>> System.out.println("\n\nThis is the static block!!!!");
>> try {
>> System.out.println("Static classloader:
>" +
>>
>Class.forName("jsp_servlet._helloworld").getClassLoader().getClass().getName
>()
>> + "\n\n");
>> }
>> catch (java.lang.ClassNotFoundException cne) { }
>> }
>> %>
>>
>> <%
>> System.out.println("Hello World.");
>> System.out.println("Class name: " + this.getClass().getName());
>> System.out.println("Class loader: " +
>> page.getClass().getClassLoader().getClass().getName());
>> %>
>> /** code ends here **/
>>
>>
>> /** Program's Output to Stdout **/
>> This is the static block!!!!
>> Static classloader:
>weblogic.utils.classloaders.RecursiveReloadOnModifyClassLoader$Slave
>>
>>
>>
>>
>> This is the static block!!!!
>> Static classloader: weblogic.servlet.jsp.OneOffJspLoader
>>
>>
>> Hello World.
>> Class name: jsp_servlet._helloworld
>> Class loader: weblogic.servlet.jsp.OneOffJspLoader
>>
>> /** End OUtput **/
>
>
Similar Messages
-
Jsp on iplanet 6.0 sp7 error: unable to load jsp class
I am having trouble to install astraweb on iplanet with following error
[06/Apr/2005:08:46:38] info (21397): WebApp service: uri = /astraweb/ contextPath = /astraweb servletPath = /index.jsp pathInfo = null servletName = jsp
[06/Apr/2005:08:46:38] info (21397): JSP11 Log:JspEngine --> /index.jsp
[06/Apr/2005:08:46:38] info (21397): JSP11 Log: ServletPath: /index.jsp
[06/Apr/2005:08:46:38] info (21397): JSP11 Log: PathInfo: null
[06/Apr/2005:08:46:38] info (21397): JSP11 Log: RealPath: /opt/iplanet60sp7/docs/astraweb/index.jsp
[06/Apr/2005:08:46:38] info (21397): JSP11 Log: RequestURI: /astraweb/
[06/Apr/2005:08:46:38] info (21397): JSP11 Log: QueryString: null
[06/Apr/2005:08:46:38] info (21397): JSP11 Log:Classpath according to the Servlet Engine is: /opt/iplanet60sp7/docs/astraweb/WEB-INF/classes:/opt/iplanet60sp7/docs/astraweb/WEB-INF/lib/Basej4.jar:/opt/iplanet60sp7/docs/astraweb/WEB-INF/lib/commons-fileupload-1.0.jar:/opt/iplanet60sp7/docs/astraweb/WEB-INF/lib/hsi.jar:/opt/iplanet60sp7/docs/astraweb/WEB-INF/lib/net.jar:/opt/iplanet60sp7/docs/astraweb/WEB-INF/lib/oreilly.jar:
[06/Apr/2005:08:46:38] info (21397): JSP11 Log:unable to load jsp class: jsps.index_jsp
[06/Apr/2005:08:46:38] failure (21397): Internal error: exception thrown from the servlet service function (uri=/astraweb/): java.lang.NullPointerException, Stack: java.lang.NullPointerException
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.isJspFileModified(JspServlet.java:231)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.loadJSP(JspServlet.java:199)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.access$4(JspServlet.java:171)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:596)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at com.iplanet.server.http.servlet.NSServletRunner.invokeServletService(NSServletRunner.java:919)
at com.iplanet.server.http.servlet.WebApplication.service(WebApplication.java:1058)
at com.iplanet.server.http.servlet.NSServletRunner.ServiceWebApp(NSServletRunner.java:981)
Any idea? ThanksIn the course of your troubleshooting to date, have you worked through the following document, Jeff?
iTunes for Windows: "Unable to load data class" or "Unable to load provider data" sync services alert -
Weblogic Class Loader issues.
Hi all!
Let me explain my problem.
I have an EJB which has in its same Java package some support classes
& also a startup class. I created an EJB jar file (containing the home,
remote, bean, the deployment descriptors & the container generated stubs)
for deployment. I also compiled all the support classes & the startup class
into the /weblogic/myserver/serverclasses directory. I also added the
required entries in the weblogic.properties file for the startup class.
Now the problem is that the support classes & the startup class contain
methods & constructors which have package level access (i.e the default
access in Java). At runtime, when my bean tries to access one of these
methods, an IllegalAccessException is thrown.
I understand that this exception is thrown when one tries to access a
method which should not be accessed (like private/protected/cross-package
access). However, both the EJB & these classes are in the same package.
So this should not be thrown.
Now the next thing I thought is that the EJB & the support classes are
being loaded by 2 different classloaders. I guess the classes under
/weblogic/myserver/serverclasses are being loaded by the WebLogic
Server ClassLoader & the EJB bean classes are being loaded by the
specialized EJB ClassLoader.
Now my question is,
1) Is it the case that the WebLogic Server does not recognize that the
EJB Bean class is in the same package as the support classes because
they are loaded by 2 separate class loaders? Please note that the EJB
jar file does not contain any support classes - so there is no
duplicate classes here.
2) Is this a bug?
3) What should I do to prevent this problem?
Some workarounds that I have done are:
1) Copied the Bean.class (implementation class of EJB bean) into the
serverclasses directory. Now the server does not throw any
IllegalAccessException. -- This, however, does not appeal as a solution
since it looks like the Bean class is now being loaded by the WebLogic
Class Loader instead of from the EJB jar file.
2) I changed all the default package access methods to public methods.
Works like a charm. -- Problem is that this is a third party set of classes
which I would like to avoid modifying.
Hope this is not too confusing. Please let me know if you need any further info.
Thanks much in advance,
--DasYou have to tell WLAS where to load your new classes. You can change
workingDir of your JSP configuration in weblogic.properties to point to your
new class directory.
Cheers - Wei
Hyung-Jin Kim <[email protected]> wrote in message
news:[email protected]..
> It seems that if I compile a class that a JSP uses while Weblogic is
> running, Weblogic's class loader has this nasty habit of caching/writing
> the class that already has loaded into memory into:
>
> weblogic/myServer/classfiles
>
> Weblogic then refers to the older class file under the above directory
> when the server is started again. Is there any way to turn this "class
> loader caching" off in Weblogic? Thanks!
>
> -hjk
>
-
Note: I am not sure what is the best suitable subject for this issue.
Stack Trace:
Error 1)
<Dec 30, 2011 11:02:51 AM GMT+05:30> <Error> <HTTP> <BEA-101017> <[ServletContext@29472630[app:EM11X module:Web path:/Web spec-version:2.5], request: weblogic.servlet.internal.ServletRequestImpl@14d05d1[
POST /Web/GenerateMealPlanAction.do HTTP/1.1
Via: 1.1 INDCHN-MGMT01
Cookie: org.ditchnet.jsp.tabs:CommercialFormulaTabs=; org.ditchnet.jsp.tabs:KitchenTabs=; JSESSIONID=sZQFT9MJQc6vS6MCSXtdjWwSTLCcG6nqL12Fdyj1NFHcp4WnpkCB!1348500068
Referer: http://130.78.88.83:7001/Web/GenerateMealPlanAction.do?vo.viewCode=generateMealPlanFrame&method=1&&menu_id=DS_DFLT&module_id=DS&function_id=DS_GEN_MEAL_PLAN&function_name=Generate%20Meal%20Plan&function_type=R&access=YYYYN&desktopFlag=N&vo.functionId=DS_GEN_MEAL_PLAN
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.1)
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: en-us
Pragma: no-cache
Connection: Keep-Alive
Content-Length: 488
]] Root cause of ServletException.
java.lang.IllegalArgumentException: Cannot invoke com.vo.GenerateMealPlanVO.setServingDate on bean class 'class com.vo.GenerateMealPlanVO' - argument type mismatch - had objects of type "java.lang.String" but expected signature "com.core.util.Date"
at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2181)
at org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:2141)
at org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1948)
at org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:2054)
at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1015)
Truncated. see log file for complete stacktrace
Caused By: java.lang.IllegalArgumentException: argument type mismatch
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:597)
at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2155)
Truncated. see log file for complete stacktrace
>
Error 2)
<Dec 30, 2011 11:11:19 AM GMT+05:30> <Error> <HTTP> <INDCHN-EPORT01> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1325223679258> <BEA-101017> <[ServletContext@29472630[app:EM11X module:Web path:/Web spec-version:2.5], request: weblogic.servlet.internal.ServletRequestImpl@1da8bfe[
POST /Web/LookupAction.do HTTP/1.1
Via: 1.1 INDCHN-MGMT01
Cookie: org.ditchnet.jsp.tabs:CommercialFormulaTabs=; org.ditchnet.jsp.tabs:KitchenTabs=; JSESSIONID=GhG4T9TJ0ytD8dhRSGBFv2c3v1hNLftTTCJQHp6Qn9C5SnMGTVYF!1348500068
Referer: http://130.78.88.83:7001/Web/core/lookup/jsp/LookupCriteria.jsp?undefined
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; InfoPath.1)
Accept: */*
Accept-Language: en-us
Pragma: no-cache
Connection: Keep-Alive
Content-Length: 304
]] Root cause of ServletException.
java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
at com.lookup.pojo.web.LookupAction.doActionQuery(LookupAction.java:107)
at com.core.pojo.web.BaseAction.execute(BaseAction.java:97)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
>
[b]Analysis:
Migrating J2EE Application from Oracle 10g Application Server to Oracle 11g Weblogic Server. I am stuck with above two issues. This issue not present while running in Oracle 10g Application Server
1) I was thinking it is something to do with JSTL versions and the below command is executed to make the JSTL version to jstl 1.1.2
java weblogic.Deployer -adminurl t3://localhost:7001 -user weblogic -password weblogic -deploy -library D:/Oracle/Middleware/wlserver_10.3/common/deployable-libraries/jstl-1.1.2.war
The problem remains same.
2) Now <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> is added to weblogic.xml to make the Web application to load application specific libraries from WEB-INF/lib directory.
The problem remains same.
3) I checked Class Loader Analysis Tool and found conflicting classes and based on CAT recommendation the below list is added to weblogic.xml and <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> is removed since both cannot co-exist.
<wls:prefer-application-packages>
<wls:package-name>antlr.*</wls:package-name>
<wls:package-name>antlr.collections.*</wls:package-name>
<wls:package-name>antlr.collections.impl.*</wls:package-name>
<wls:package-name>antlr.debug.misc.*</wls:package-name>
<wls:package-name>com.mysql.jdbc.*</wls:package-name>
<wls:package-name>javax.ejb.*</wls:package-name>
<wls:package-name>javax.ejb.spi.*</wls:package-name>
<wls:package-name>javax.enterprise.deploy.*</wls:package-name>
<wls:package-name>javax.jms.*</wls:package-name>
<wls:package-name>javax.management.j2ee.*</wls:package-name>
<wls:package-name>javax.resource.*</wls:package-name>
<wls:package-name>javax.resource.cci.*</wls:package-name>
<wls:package-name>javax.resource.spi.*</wls:package-name>
<wls:package-name>javax.security.jacc.*</wls:package-name>
<wls:package-name>javax.servlet.*</wls:package-name>
<wls:package-name>javax.servlet.http.*</wls:package-name>
<wls:package-name>javax.servlet.jsp.*</wls:package-name>
<wls:package-name>javax.transaction.*</wls:package-name>
<wls:package-name>javax.transaction.xa.*</wls:package-name>
<wls:package-name>javax.xml.*</wls:package-name>
<wls:package-name>javax.xml.datatype.*</wls:package-name>
<wls:package-name>javax.xml.namespace.*</wls:package-name>
<wls:package-name>javax.xml.parsers.*</wls:package-name>
<wls:package-name>javax.xml.registry.*</wls:package-name>
<wls:package-name>javax.xml.transform.*</wls:package-name>
<wls:package-name>javax.xml.validation.*</wls:package-name>
<wls:package-name>javax.xml.xpath.*</wls:package-name>
<wls:package-name>oracle.core.lmx.*</wls:package-name>
<wls:package-name>oracle.core.lvf.*</wls:package-name>
<wls:package-name>oracle.jdbc.*</wls:package-name>
<wls:package-name>oracle.jdbc.aq.*</wls:package-name>
<wls:package-name>oracle.jdbc.connector.*</wls:package-name>
<wls:package-name>oracle.jdbc.dcn.*</wls:package-name>
<wls:package-name>oracle.jdbc.diagnostics.*</wls:package-name>
<wls:package-name>oracle.jdbc.driver.*</wls:package-name>
<wls:package-name>oracle.jdbc.internal.*</wls:package-name>
<wls:package-name>oracle.jdbc.oci.*</wls:package-name>
<wls:package-name>oracle.jdbc.oracore.*</wls:package-name>
<wls:package-name>oracle.jdbc.pool.*</wls:package-name>
<wls:package-name>oracle.jdbc.rowset.*</wls:package-name>
<wls:package-name>oracle.jdbc.util.*</wls:package-name>
<wls:package-name>oracle.jdbc.xa.*</wls:package-name>
<wls:package-name>oracle.jpub.runtime.*</wls:package-name>
<wls:package-name>oracle.jsp.provider.*</wls:package-name>
<wls:package-name>oracle.net.ano.*</wls:package-name>
<wls:package-name>oracle.net.aso.*</wls:package-name>
<wls:package-name>oracle.net.jdbc.*</wls:package-name>
<wls:package-name>oracle.net.jndi.*</wls:package-name>
<wls:package-name>oracle.net.ns.*</wls:package-name>
<wls:package-name>oracle.net.nt.*</wls:package-name>
<wls:package-name>oracle.net.resolver.*</wls:package-name>
<wls:package-name>oracle.security.o3logon.*</wls:package-name>
<wls:package-name>oracle.security.o5logon.*</wls:package-name>
<wls:package-name>oracle.sql.*</wls:package-name>
<wls:package-name>oracle.sql.converter.*</wls:package-name>
<wls:package-name>org.apache.commons.*</wls:package-name>
<wls:package-name>org.apache.derby.*</wls:package-name>
<wls:package-name>org.apache.oro.*</wls:package-name>
<wls:package-name>org.apache.xerces.*</wls:package-name>
<wls:package-name>org.apache.xmlcommons.*</wls:package-name>
<wls:package-name>org.gjt.mm.*</wls:package-name>
<wls:package-name>org.joda.time.*</wls:package-name>
<wls:package-name>org.w3c.dom.*</wls:package-name>
<wls:package-name>org.xml.sax.*</wls:package-name>
</wls:prefer-application-packages>
The problem remains same.
Your help is greatly appreciated as I am stuck with this issue.No I cannot ignore this error while deplyment. I'm not able to deploy the war.
More ovet this needs to be working as during startup, the servlet loads some xml files and convert into tables for the kiosk in the airport to be working.
Edited by: [email protected] on Mar 27, 2009 12:24 PM -
Hi,
I got NoClassDefFoundError and when I use ClasspathDebug jsp it shows that the class is loaded by "java.net.URLClassLoader". I put the jar file containing the class in <domain>/lib directory. According to docs the jar under <domain>/lib should be loaded by system class loader. what is "java.net.URLClassLoader"? why isn't system loader loading my class? I am using wls91. Thanks
weblogic.servlet.jsp.TagFileClassLoader
weblogic.utils.classloaders.ChangeAwareClassLoader
weblogic.utils.classloaders.GenericClassLoader
weblogic.utils.classloaders.GenericClassLoader
java.net.URLClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
Bootstrap classloaderI'm not sure from reply 2 whether you figured out what's going on or not. It sounds like you did, but just in case...
The null/primordial/bootstrap class loader loads classes in the core API--stuff it finds in the ext dir(s?) (e.g. rt.jar)--Object, String, java.util.*, java.sql.*, etc. It has no parent. It is the root of the normal delegating classloader tree.
The system classloader is the one that uses classpath to load your classes and 3rd party classes. Everything not in the core API, as long as neither you nor those other classes explicitly specify a different classloader.
The way the normal delegation mechanism works is that a request to load a class is first passed to the loader that loaded the current class. This loader first gives its parent a chance to load it, and so on up the tree to the primordial loader.
Once it hits the root (null/primordial/bootstrap), that classloader tries to load it. If it can't (and the primordial loader can't, in fact, load your class, since it's not in the ext dir), then it hands it back to its child. This continues down the line, with the parent getting first shot at loading, then the child trying if the parent fails.
The primordial loader (which loaded the JdbcOdbcDriver) can't load your class. It hands it back to its child--the system classloader--which can and does load it, using classpath.
I hope that answers any lingering questions, if there were in fact such questions. -
Jsp configuration load on start up in web.xml
Is my configuration for jsp correct.i want my JSP to be loaded after servlet initialised.What changes i need to do to make it work on any server..like tomcat or websphere
<!-- JSP CONFIGURATION -->
<jsp-file>/hello.jsp</jsp-file>
<load-on-startup>2</load-on-startup>
<!-- SERVLET CONFIGURATION -->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
<!-- or -->
<jsp-file>/hello.jsp</jsp-file>
<!-- optional and one only, greater value than 0 means don't wait for the first request load it beforehand -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Message was edited by:
raghuveer_vellankiwhen you give a load on startup value as 1 for a servlet declaration in the web.xml the Server calls your servlet when u start it, and calls means the server loads your servlet anc calls the init method. so u may do whatever you like in init method like starting some other application, setting some parameters , etc
-
New to dynamic class loading - could you help me?
Hi all!
Thanks so much for taking a minute to read my post.
I am a rookie at java and programming.
I have a program that needs to load a class (or java file) dynamically during runtime. (At least I think that is what it needs to do.)
I want the user of the program to be able to specify a .java or a .class file either somewhere on the local disk or network, but not necessarily in the same location as the program itself. Once that file is selected, I would like the program to be able to use that file as if it were a .class file created in the working directory when the program was compiled and created.
I have read a lot of the forums, and I think I need to write my own class loader. I tried creating a class loader, and the code is shown below. (I borrowed this code from some of the other forums I've read.)
Here is my problem.
1. Should I be trying to extend the ClassLoader class? Am I on the right track?
2. If I am on the right track, should I require the user of my program to select a previously compiled ".class" file? Or should I ask them to indicate a ".java" file, and try to compile the java file with the program?
3. I'm sure that if the above two questions are answered, the solution to this problem will become obvious. But for clarity, I should mention that with the current code (below), I keep getting a java.lang.NoClassDefFoundError inside the class FileClassLoader at the line:
c = defineClass (classname, buff, 0, buff.length); Obviously, I am not providing the right information to this FileClassLoader in order to create the class. Can you help me out?
Thank you in advance!
I really appreciate it!
Best Regards,
Julia
class SampleClass
public void sampleMethod()
final JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(optionPane);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try
FileClassLoader loader = new FileClassLoader(file);
Class cl = loader.loadClass(file.getName(),false);
}catch ( ClassNotFoundException e ) {
System.out.println("ClassNotFoundException");
}catch (IllegalAccessException e) {
System.out.println("IllegalAccess");
}catch( InstantiationException e) {
System.out.println("Can't Instantiate That");
class FileClassLoader extends ClassLoader
private File file;
public FileClassLoader (File thisFile)
this.file = thisFile;
protected synchronized Class loadClass(String s, boolean bool) throws ClassNotFoundException
Class c = null;
try {
int size = (int)file.length();
byte buff[] = new byte[size];
FileInputStream fis = new FileInputStream(file);
DataInputStream dis = new DataInputStream (fis);
dis.readFully (buff);
dis.close();
String classname = null;
String filename = file.getName();
int i = filename.lastIndexOf('.');
if(i>0 && i<filename.length()-1)
classname = filename.substring(0,i);
c = defineClass (classname, buff, 0, buff.length);
resolveClass (c);
} catch (java.io.IOException e) {
e.printStackTrace();
return c;
}Hi!
If you really need to do that, you can give a look at my previous post at:
http://forum.java.sun.com/thread.jsp?forum=4&thread=285674
You can play with the code to suit your needs.
Hope this helps. -
Weblogic Class Loader caching/writing classes to weblogic/myServer/classfiles
It seems that if I compile a class that a JSP uses while Weblogic is
running, Weblogic's class loader has this nasty habit of caching/writing
the class that already has loaded into memory into:
weblogic/myServer/classfiles
Weblogic then refers to the older class file under the above directory
when the server is started again. Is there any way to turn this "class
loader caching" off in Weblogic? Thanks!
-hjk
You have to tell WLAS where to load your new classes. You can change
workingDir of your JSP configuration in weblogic.properties to point to your
new class directory.
Cheers - Wei
Hyung-Jin Kim <[email protected]> wrote in message
news:[email protected]..
> It seems that if I compile a class that a JSP uses while Weblogic is
> running, Weblogic's class loader has this nasty habit of caching/writing
> the class that already has loaded into memory into:
>
> weblogic/myServer/classfiles
>
> Weblogic then refers to the older class file under the above directory
> when the server is started again. Is there any way to turn this "class
> loader caching" off in Weblogic? Thanks!
>
> -hjk
>
-
Fetching record from table and displaying in JSP while loading page -struts
Hi all,
I have a problem relating to struts .
I am fetching records from database and I want to diaplay those records in corresponding fields in the jsp page.
I am using Struts MVC Framework.
I am giving the sample code below.
In my action class i am giving the following code.
String sql="Select empname from emp where empcode='1' ";
ResultSet rs=S.executeQuery(sql);
if(rs.next()){
EditForm e=new EditForm();
e.setEmpname(rs.getString(1));
In my Action Form
I gave setter and getter methods for Empname
public String getEmpname() {
return empname;
public void setEmpname(String empname) {
this.empname = empname;
In my jsp gave
<html:form method="POST" action="submitForm.do?action=1" >
<html:text property="empname" />
</html:form>
The targets given are correct and it is being redirected.
But the value is not displaying in the textbox while the jsp is loading.
There is a record for the sql query.
Anybody please help me out
It is very urgent
Thank You
ParvathyNow in the following code, why are u creating a new form?
Why dont you use the form which is input to the Action Class's execute methof?
if(rs.next()){
EditForm e=new EditForm();
e.setEmpname(rs.getString(1));
}Thanks and regards,
Pazhanikanthan. P -
WS 7.0 seemingly not honoring class-loader delegate="false"
I have a JSF web application that I ship with MyFaces jars.
I have added a sun-web.xml file in WEB-INF telling the server not to delegate class loading to its parent classloader.
However, it seems that the server chooses to use the JSF implementation that comes with the server (lib/jsf-api.jar and lib/jsf-impl.jar).
Of course, the exact same application worked perfectly with WS 6.1 (but JSF was not included in the server distribution).
Is there something I am missing?Here is a sample index.jsp I use to determine where my classes come from.
When I type something like "javax.faces.FactoryFinder" it finds the class in
Classloader: sun.misc.Launcher$AppClassLoader@1ba34f2
URL=jar:file:/C:/soft/SunWebServer7/lib/jsf-api.jar!/javax/faces/FactoryFinder.class
This is not what I expected, since I embedded an alternate JSF implementation in my web application.
Strangely enough, when I embed, say, ant in my webapp, it's the right class that is found, not the one in the lib/ directory on the server.
Does JSF have a special status?
<%@page contentType="text/html; charset=ISO-8859-1"%>
<%@page import="java.net.URL"%>
<%@page import="java.io.ByteArrayOutputStream"%>
<%@page import="java.io.PrintStream"%>
<html>
<head>
<title>Test Sun Server 7.0</title>
</head>
<body>
Only a static text.
<br>
<form>Resource:<input type="text" name="classname"></input><br>
<input type="submit"></input><br>
</form>
<%
String us = "<null>";
String c = "<null>";
try {
c = request.getParameter("classname");
Class cl = Class.forName(c);
out.println("Classloader: " + cl.getClassLoader() + "<br>");
String[] parts = c.split("\\.");
String small = parts[parts.length - 1];
URL u = cl.getResource(small + ".class");
us = u.toString();
} catch (Throwable t) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
PrintStream o = new PrintStream(baos);
t.printStackTrace(o);
o.flush();
o.close();
us = baos.toString();
us = us.replaceAll("\\n", "<br>");
%>
<br>
<br>
CLASS=<%=c%><br>
URL=<%=us%><br>
</body>
</html> -
How to load a class dynamically in the current/system class loader
I need to dynamically load a new jdbc driver jar to the current/system class loader... Please note that creating a new classloader will not help since the DriverManager refers to the systemclassloader itself.
Restarting the application by appending the jar to its classpath will solve the problem but I want to avoid doing this.Did you then create a ClassLoader to load the JDBC
driver and then install it into the system as
directed by the JDBC specification (ie
Class.forName(someClassName))?
And then try to use it from a class loaded fromsome
other ClassLoader (i.e. the system class loader)?
If you did not try this please explain why not.O.K. I just looked at the source to
java.sql.DriverManager. I did not know what I was
talking about, as what I suggested above will not
work.
This is my new Idea:
Create a URLClassLoader to load the JDBC driver also
in this ClassLoader you need to place a helper class
that does the following:
public class Helper {
public Driver getJDBCDriver(String driverClassName,
String url) {
try {
Class.forName(driverClassName);
Driver d = DriverManager.getDriver(url);
return d;
catch(Exception ex) {
ex.printStackTrace();
return null;
}Now create an instance of the Helper class in the new
ClassLoader, and call its getJDBCDriver method to get
an instance of the driver (you will probably have to
create an interface in the root class loader that the
Helper implements so that you can easily call it).
Now from the root classloader you can make calls
directly to the returned Driver and bypass the
DriverManager and its restrictions on cross
ClassLoader access.
The only catch here is that you would have to call to
the returned Driver directly and not use the Driver
Manager.This sounds like will work but I did not want to load DriverManager in a new classloader.. I did a hack
I unzip the jar dynamically in a previously known location (which I included in my classpath when launching the app). The classLoader finds the class now though it did not exist when the app was launched !
A hack of-course but works eh .. -
Error building project using kXML2 - "Class loading error: Wrong name"
Hi,
I'm testing the XML-Parser KXML2 and downloaded the latest package, but the minimal version (kxml2-min.zip). I put this file into the directory "%j2mewtk%\apps\KxmlTest\lib" and wrote the lines
import org.kxml2.io.*;
import org.xmlpull.v1.*;
When I try to build the project with the Wireless Toolkit (v1.04) it spits out the following error:
Error preverifying class kxml2.io.KXmlParser
Class loading error: Wrong name
com.sun.kvem.ktools.ExecutionException: Preverifier returned 1
Build failed
I also tried the full package "kxml2.zip" but the same error occurs.
How can I get rid of this? Thanks in advance!Okay, finally worked it out (hopefully). I unpacked the archive to a directory (say "%J2MEWTK%\apps\KxmlTest\tmpclasses") and then preverified them "manually":
%J2SDK%\bin\preverify.exe -classpath "%J2MEWTK%\apps\KxmlTest\tmpclasses";"%J2MEWTK%\lib\midpapi.zip" org.kxml2.io.KXmlParser
%J2SDK%\bin\preverify.exe -classpath "%J2MEWTK%\apps\KxmlTest\tmpclasses";"%J2MEWTK%\lib\midpapi.zip" org.xmlpull.v1.XmlPullParser
%J2SDK%\bin\preverify.exe -classpath "%J2MEWTK%\apps\KxmlTest\tmpclasses";"%J2MEWTK%\lib\midpapi.zip" org.xmlpull.v1.XmlPullParserException
Then I packed them again to a jar-file:
%J2SDK%\bin\jar.exe -cvf kxml2-min.jar %J2MEWTK%\apps\KxmlTest\tmpclasses\output\.
That was all! -
Need help to set values from web.xml in a jsp class
Hey :-)
I`m trying to get value from my web.xml file into a jsp class. The problem is that the value always retur null. My web.xml file is replaced in the WEB-INF directory where should be. Here is my web.xml
<servlet>
<servlet-name>Html</servlet-name>
<servlet-class>Html</servlet-class>
<init-param>
<param-name>html_test</param-name>
<param-value>Value I want have in my jsp class
</param-value>
</init-param>
</servlet>
And her i my java class who don`t work:
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import javax.servlet.ServletConfig;
public class Html extends BodyTagSupport
String title="";
String html_test;
ServletConfig config;
public void doInitBody() throws JspException
html_test = config.getInitParameter("html_test");
}//End of method doInitBody()
public int doStartTag() throws JspException
try
JspWriter out = pageContext.getOut();
out.print( "<HTML>\n" );
out.print( "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" );
out.print( "<BODY>\n" );
out.print( "<BR><H1>" + html_test + "</H1>" );
And here are my html_test variable return null.
I hope somone can help me, duke dollars will be given away for the solution answer.
paulsepNothing seems to work, have change the string and rewritten the web.xml file to:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>html_test</param-name>
<param-value>Value I want have in my jsp class</param-value>
</context-param>
</web-app> -
Performance issues with class loader on Windows server
We are observing some performance issues in our application. We are Using weblogic 11g with Java6 on a windows 2003 server
The thread dumps indicate many threads are waiting in queue for the native file methods:
"[ACTIVE] ExecuteThread: '106' for queue: 'weblogic.kernel.Default (self-tuning)'" RUNNABLE
java.io.WinNTFileSystem.getBooleanAttributes(Native Method)
java.io.File.exists(Unknown Source)
weblogic.utils.classloaders.ClasspathClassFinder.getFileSource(ClasspathClassFinder.java:398)
weblogic.utils.classloaders.ClasspathClassFinder.getSourcesInternal(ClasspathClassFinder.java:347)
weblogic.utils.classloaders.ClasspathClassFinder.getSource(ClasspathClassFinder.java:316)
weblogic.application.io.ManifestFinder.getSource(ManifestFinder.java:75)
weblogic.utils.classloaders.MultiClassFinder.getSource(MultiClassFinder.java:67)
weblogic.application.utils.CompositeWebAppFinder.getSource(CompositeWebAppFinder.java:71)
weblogic.utils.classloaders.MultiClassFinder.getSource(MultiClassFinder.java:67)
weblogic.utils.classloaders.MultiClassFinder.getSource(MultiClassFinder.java:67)
weblogic.utils.classloaders.CodeGenClassFinder.getSource(CodeGenClassFinder.java:33)
weblogic.utils.classloaders.GenericClassLoader.findResource(GenericClassLoader.java:210)
weblogic.utils.classloaders.GenericClassLoader.getResourceInternal(GenericClassLoader.java:160)
weblogic.utils.classloaders.GenericClassLoader.getResource(GenericClassLoader.java:182)
java.lang.ClassLoader.getResourceAsStream(Unknown Source)
javax.xml.parsers.SecuritySupport$4.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
javax.xml.parsers.SecuritySupport.getResourceAsStream(Unknown Source)
javax.xml.parsers.FactoryFinder.findJarServiceProvider(Unknown Source)
javax.xml.parsers.FactoryFinder.find(Unknown Source)
javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)
org.ajax4jsf.context.ResponseWriterContentHandler.<init>(ResponseWriterContentHandler.java:48)
org.ajax4jsf.context.ViewResources$HeadResponseWriter.<init>(ViewResources.java:259)
org.ajax4jsf.context.ViewResources.processHeadResources(ViewResources.java:445)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:193)
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
On googling this seems to be an issue with java file handling on windows servers and I couldn't find a solution yet. Any recommendation or pointer is appreciatedHi shubhu,
I just analyzed your partial Thread Dump data, the problem is that the ajax4jsf framework ResponseWriterContentHandler triggers internally a new instance of the DocumentBuilderFactory; every time; triggering heavy IO contention because of Class loader / JAR file search operations.
Too many of these IO operations under heavy load will create excessive contention and severe performance degradation; regardless of the OS you are running your JVM on.
Please review the link below and see if this is related to your problem.. This is a known issue in JBOSS JIRA when using RichFaces / ajaxJSF.
https://issues.jboss.org/browse/JBPAPP-6166
Regards,
P-H
http://javaeesupportpatterns.blogspot.com/ -
How can I make server use single class loader for several applications
I have several web/ejb applications. These applications use some common libraries and should share instances of classes from those libraries.
But applications are being deployed independently thus packaging all them to EAR is not acceptable.
I suppose the problem is that each application uses separate class loader.
How can I make AS use single class loader for a set of applications?
Different applications depend on different libraries so I need a way that will not share library for all applications on the domain but only for some exact applications.
When I placed common jar to *%domain%/lib* - all works. But that jar is shared between all applications on the domain.
When I tried to place common jar to *%domain%/lib/applibs* and specified --libraries* attribute on deploying I got exception
java.lang.ClassCastException: a.FirstDao cannot be cast to a.FirstDaoHere http://download.oracle.com/docs/cd/E19879-01/820-4336/6nfqd2b1t/index.html I read:
If multiple applications or modules refer to the same libraries, classes in those libraries are automatically shared.
This can reduce the memory footprint and allow sharing of static information.Does it mean that classes should be able to be casted ?You didn't specify which version of the application server you are using, but the config is similar as long as you know what to look for. Basically, you need to change the classloader delegation. Here's how it is done in 8.2
http://download.oracle.com/docs/cd/E19830-01/819-4721/beagb/index.html
Maybe you are looking for
-
Rearranging folders on my hard drive
I know there's probably a FAQ that addresses this issue, but I can't find it... I am integrating Lightroom, but I need to rearrange the way my folders are stored on my hard drive. I want to modify my current system to put the folders in by year shot.
-
I downloaded 1100 photos from Kodak Easy Share to the Iphoto library. Now when I open
-
Setting: Date and Time question
Don't ask but I really just noticed this now since the last clock change in March... I changed the time to the correct time but every day it defaults back an hour or really every time I turn it on to use, it defaults back to the wrong time. How do yo
-
Error when try Specify User-Defined Text Types
Hi all, I have a problem when I try to Specify User-Defined Text Types. The system gave me the error what is described below. Do you know how to solve a problem? F1 Choose the key from the allowed namespace Message no. SV019 Diagnosis You have attemp
-
I need read java bytecode to understand the structure of a class. I need know the variable and the method of a class. I do this using the library javassist. I would like to know wich method are called inside a method. I think I should interpratate th