Class loaded from system classpath
When I kick off my WebLogic Server 8.1 SP2 startWebLogic.sh I get the following:
<Warning> <EJB-010001> <While deploying EJB 'blah, blah, blah', class yadda.yadda.yadda was loaded from the system classpath. As a result, this class cannot be reloaded while the server is running. To prevent this behavior in the future, make sure the class is not located in the server classpath.>
How do I do this? I need to be able to make changes to code, compile it and "drop" it into my application directory without having to stop and restart my server.
I would appreciate any assistance.
Thank you.
Steve
Hi Steve,
When you start weblogic server it has the EJB home, remote or bean class in its classpath. So when you deploy the bean it loads the classes from the system classpath.
To avoid this error, make sure that your server classpath does not contain any of the bean classes.
vasanthi ramesh
Similar Messages
-
Dynamic class loading from JARs in web application
Hello,
I'm working on a web project in which we would like to dynamically load plugins without server restart.
We have developed our own ClassLoader in order to load the plugins from a path or with a user interface upload function.
The class loader hierarchy should be something like this:
Bootstrap
|
System
|
Common
Catalina Shared
Webapp1 OurSystem
PluginClassLoaderThe all works fine within the classes loaded in the PluginClassLoader, but classes loaded in OurSystems class loader cannot access classes loaded in PluginClassLoader. For example when Hibernate tries to load classes definied in mapping files we got a java.lang.ClassNotFoundException.
Is there a way to load classes dynamically to OurSystems class loader or notify it about PluginClassLoaders classes?
Or is this a bad way to do it?
Best regards,
Kristoffer RenholmHi,
Sounds like a classpath problem that the folks in the workshop newsgroup
could help with. Try asking your question in:
http://newsgroups.bea.com/cgi-bin/dnewsweb?cmd=xover&group=weblogic.developer.interest.workshop&utag=
Bruce
Graeme Dougal wrote:
>
Hi, I am developing a web service with weblogic workshop. The JWS file references
other classes one of which is a factory for distributing various implementations
of an interface. I am trying to dynamically load the relevant class to be distributed
from the factory via its name, e.g. Class c = Class.forName(className)
However I keep getting a classNotFoundException.
Any ideas ?? -
Dynamic class loading from directory on server
Hello,
I am not sure if this is right forum, but I think it is more weblogic then ADF issue...
I am trying to create and load dynamically classes in weblogic (10.3.2.0). It is ADF application which I deploy to the weblogic server.
When I print ((GenericClassLoader)this.getClass().getClassLoader()).getFinderClassPath()I see the path to my directory (of course not just this path) C:\...\system11.1.1.2.36.55.36\DefaultDomain\servers\DefaultServer\tmp\_WL_user\test\753the\dynamicClasses(I have added directory dynamicClasses to manifest for deployment WAR profile).
In this directory I create class files. I have checked it, files are really created there.
When I try to load created class with the same classloader, for which I have printed classpath, ClassNotFoundException is thrown.
Please where could be the problem? Isn't it possible to load classes from directory instead of jar, do I need some special server configuration,...?
Thank you in advance
QjetaHi Qjeta,
I am not sure but you can give it a try using URLClassLoader...Which we generally use for DynamicClassLoading:
import java.net.URLClassLoader;
<font color=maroon>
String path="C:/.../system11.1.1.2.36.55.36/DefaultDomain/servers/DefaultServer/tmp/_WL_user/test/753the/dynamicClasses";
*URLClassLoader loader = new URLClassLoader(new URL[] { new URL(path) });*
Class c = loader.loadClass ("your.class.NameHere");
</font>
// Load class from class loader. filly qualified class name (means classname with package name) is the name of the class to be loaded
in the above code the "C:/.../system11.1.1.2.36.55.36/DefaultDomain/servers/DefaultServer/tmp/_WL_user/test/753the/dynamicClasses" should be the location of the directory where your classes are placed....If you want to load a perticular Jar then you need to write the jarfile name as well like following:
C:/.../system11.1.1.2.36.55.36/DefaultDomain/servers/DefaultServer/tmp/_WL_user/test/753the/dynamicClasses/Myapplication.jar
.================================
If the above code works for you then later you can even try to enhance your code by doing the following:
Thread.currentThread().setContextClassLoader(urlClassLoaderRef);
Thanks
Jay SenSharma
http://jaysensharma.wordpress.com (WebLogic Wonders Are Here) -
Dynamic class loading from String name
Hello all,
I have a question for dynamic class loading:
If I have a String variable that represents a class name, how can i use it to make dynamically an object of the class tha the string variable represents?
For example i have a string like this
String classname="String";
Using this i want to make a new String object .
Can anyone tell me how can i do this(example plz)?I have worked out the code and this works fine:
import java.lang.*;
class dynamictestname{
public dynamictestname() {
public static Class test(String objname){
try{
Class theClass = Class.forName(objname);
return theClass;
} catch (ClassNotFoundException e)
throw new NoClassDefFoundError (e.getMessage());
public static void main (String [] args){
String classname="java.lang.String";
Class thisClass=dynamictestname.test(classname);
try{
Object instance = thisClass.newInstance();
}catch(InstantiationException e){
}catch(IllegalAccessException ie){
}The new problem i 've faced is that i can't instatiate a new object by the class i have created.I saw some examples with use of the java.lang.reflect but this class i used with user created classes which have methods that the user wants to run dynamically.
I just want to make an object from the class and give it a value.
For example if the object i have created with the
Object instance = thisClass.newInstance();is an object of java.lang.String class
how can i do something like this below dynamically from instance object :
String x="TEST ";
Thanks for the help.. -
Can I set Boot class loader or system class loader?
In my application, there are classes in a jar files, all these files in the jar need be loaded by a ClassLoader in my application.
And the classes out of jar do not need the ClassLoader to load. the structure is like :
-----myapp.jar ------in this jar, all classes need be loaded by a specified ClassLoader
|---anoapp ------classes in this package, is normal classes
|-------|----a.class
|----b.class
| ----other classes
but my a.class need to access a class in myapp.jar, so I load the class use my ClassLoader, but there still occur
**********ClassFormatError : bad magic number**************
I print the classloader in a.class
+---- System ClassLoader is : com.sun.misc.Launcher$AppClassLoader ------------it is not my ClassLoader
+---- a.class.getClassLoader is same as System ClassLoader -------------------it still is not my ClassLoader
+---- Thread.currentThread().getContextClassLoader ------------------ it is my ClassLoader
So I think when I access class in myapp.jar, it will loaded by System ClassLoader or Bootstrap ClassLoader, if I can set one these two classloader as my ClassLoader, it maybe not occur the Error,
But There are not obvious method in System or Runtime etc.
1. So can Set System Classloader or Bootstrap ClassLoader?
2. If not, How can solve my problem?
Thands in advanced!**********ClassFormatError : bad magic number**************If you get that error, then no classloader will help you. This is a problem with your running code meant for a newer version of the Virtual Machine in an older version.
Looks like you're compiling the code with a recent JDK (1.4.x?), but running with an older VM. Try just typing "java -version" and see what it prints.
This should just be a matter of running with the right VM. If this is an applet you're trying to run inside the browser, make sure that the browser is using the right VM. Run the "Java Control Panel" and select the correct version. -
Where are classes loaded from ?
How can I find out programmatically the url where a class is loaded from ?
Something like the info given by "java -verbose:class MyApp".
I don't see any method doing this in the class Classloader...
Any idea ?Haven't tried it, but what about trying URL wheresMyClass = ClassLoader.getSystemResource("myPackage.myClass") ?
-
Does anyone know why it is that if I copy a JAR into JavaTasks, ScheduleTask, ThirdPary, or ext on my development cluster, it is automatically loaded by OIM, but if I try the same in my QA cluster, I must explicitly add the JAR to my classpath?
Thanks!Anything to do with class reloading configuration in the xlconfig.xml file ??
Regards
Namboodiri -
How do I add the system classpath to Jar Manifest Class-Path
My application is implemented on win2000 and need to be moved to unix as a executable jar file, the oracle jdbc classes (classes12.zip and classes111.zip) were included in MANIFEST.MF as the following:
Class-Path: /Oracle/Ora81/jdbc/lib/classes12.zip /Oracle/Ora81/jdbc/lib/classese111.zip
When I move the jar file to unix, the classpath will be changed, is there a way to make the jar file read the class-path from system CLASSPATH?
Thank you.
Y.I have the same problem for weeks now, and I can't seem to get it solved. If you found anything please inform me.
thanks in advance
Eran -
Why are these classes equal? Loaded from different classloaders.
I thought that classes loaded from different classloaders were seen as different in the JVM? But this code prints true to every check:
try
Class c = new URLClassLoader( new URL[] { new URL( "jar:file://home/tests/test.jar!/" ) } ).loadClass( "Test" );
Class c2 = new URLClassLoader( new URL[] { new URL( "jar:file://home/tests/test.jar!/" ) } ).loadClass( "Test" );
System.out.println( ( c == c2 ) );
System.out.println( ( c.equals( c2 ) ) );
System.out.println( ( c.getName().equals( c2.getName() ) ) );
catch (Exception e)
e.printStackTrace();
}DrClap wrote:
The more unbelievable thing is that this:
System.out.println( ( c == c2 ) );prints "true". That shouldn't happen, and it's nothing to do with facts about classloaders. It shouldn't happen because "new" called twice should produce two different objects, no matter what kind of objects they are.
I didn't try your code because I would have had to spend a couple of minutes creating suitable jar files. But did you actually run that code? Or is it a reduction of some larger piece of code and you just assumed it would do what you said it does? Because I don't believe that.I actually ran the code and every line DID print out true. This is in Java 1.5.
I figured out why they're all true though - it's because the jar file was in the classpath, so the classes were loaded by a different classloader (the same one). When I put the jar out of the classpath, the statments printed out like this:
//false
System.out.println( ( c == c2 ) );
//false
System.out.println( ( c.equals( c2 ) ) );
//true
System.out.println( ( c.getName().equals( c2.getName() ) ) );I agree on the first one printing true but I seem to remember something about how they changed that rule in Java 1.5. I could be wrong but in c++, that would be a completely valid true statement (assuming your class implemented the "==" operator), so maybe they changed it to be in line with that? -
Class Loader Hierarchy in Weblogic 7.0
I have read the BEA documentation on the class loader hierarchy in Weblogic Server,
and I have some questions regarding some behavior I am seeing.
I am running Weblogic Server 7.0.
I have an ear file that contains 3 web apps (wars) and several utility jars. The
web apps' manifests contain the Class-Path entry for the utility jars. My understanding
of this is that each web app SHOULD have its own class loader. Also, the utility
jars will be scoped in a separate class loader and WILL NOT have visibility to
the web app classes. The web app classes should have visibility to the utility
jars.
Is this correct????
I added a static segment of code in each web app and printed the class loader
for each servlet when it was loaded. I also printed the class loader from a class
that is DEFINITELY contained in one of the utility jars. Here is the result:
Utility Class ClassLoader: sun.misc.Launcher$AppClassLoader@b9d04 Utility Class
Parent ClassLoader: sun.misc.Launcher$ExtClassLoader@71732b
Servlet 1 ClassLoader: sun.misc.Launcher$AppClassLoader@b9d04 Servlet 1 Parent
ClassLoader: sun.misc.Launcher$ExtClassLoader@71732b
Servlet 2 ClassLoader: sun.misc.Launcher$AppClassLoader@b9d04 Servlet 2 Parent
ClassLoader: sun.misc.Launcher$ExtClassLoader@71732b
I'm a little confused.... I expected to see 3 different class loaders (i.e. one
for each class above). I believe the above printout says that all 3 classes are
being loaded by the SAME class loader instance (Launcher$AppClassLoader@b9d04).
Am I interpreting this correctly? If so, what's going on?I rechecked the classpath for the user that starts Weblogic, and in the classpath
I found the project "src" directory (must have missed it earlier). When we did
our build, the classes are placed in the src structure then copied to the build
area. That's the reason I was not seeing the appropriate class loader hierarchy.
Thanks for all of the comments.
"Sanjeev Chopra" <[email protected]> wrote:
>
"Mark Cotherman" <[email protected]> wrote in message
news:[email protected]...
Thanks for your comments again Mark. I'm just trying to get a goodhandle
on how
this is working.
I'll assume that somehow my web app classes are being loaded into theroot
classloader.
The next question is... why??Just to be sure - is there any way these classes are sneaking into the
system classpath ?
My ear file contains the following:
a.war
b.war
c.war
lib/util1.jar
lib/util2.jar
lib/util3.jar
lib/util4.jar
The manifest in all three wars reference all util jars. This ear deployssuccessfully
on Weblogic with no errors.
How could these separate servlets (one in each war) not have seperateclass loaders
seperate from the root where the utils should reside. I don't thinkthat
I have
any control over where Weblogic loads the war classes, or do I?
See comments below....
Mark Spotswood <[email protected]> wrote:
Mark Cotherman wrote:
Thanks for the follow-up.
I want to make sure I follow what you are saying. All classes in
the
manifest
Class-Path of WARs are exported to the parent classloader.That's right.
To me this is the correct behavior since the manifest Class-Path
is
meant to provide
a way to share common utility classes among several web apps. AllEJB jars and
manifest Class-Path entries should be loaded by the same class loader.Its a way to share class definitions, but not necessarilly class
instances. I don't think that a web application should be extending
the classpath of its parent's classloader. This leads to namespace
problems as well as reloadability issues.
Ok, you lost me here. Shouldn't delegation handle the namespacecollisions??
If the web app class loader has a class definition (webapp:com.xyz.ClassA) with
exactly the same name in the same package as the root class loader(rootloader:
com.xyz.ClassA), I thought the web app would use (delegate loading)the
class
definition from the root class loader when PreferWebInf is set to false.
Isn't this why the PreferWebInf attribute, when set to true, can causeClassCastExceptions??
The web app when creating an instance of (webapp: com.xyz.ClassA)from
the web
app class loader can potentially pass a reference to this instanceto a
class
instance loaded from the root loader. The root class loader has adifferent class
definition for ClassA.
REALLY what makes since is that all common jar files be defined
in
the manifest
Class-Path OF THE ear FILE (if the WAR(s) are in an ear). These
jar
files should
then be loaded by the same class loader as the EJB jars. There shouldbe no need
for the WARs to have any reference to the utility jars since the
EJB
class loader
is the parent of the WAR class loaders.The ear file doesn't have a manifest classpath, but what you are getting
at makes sense. If you add a manifest to any EJBs in your app, theall
webapps (as well as all other EJBs) will be able to see it, sincewith
our structure, EJBs are loaded into the application's root classloader.
My problem is that the ACTUAL SERVLET classes are NOT being loadedby a separate
class loader from the EJB and common jar class loader. This is
completely
against
what is being said in the Weblogic documentation. The Manifest
Class-Path
should
have nothing to do with where the classes that reside in
WEB-INF/classes
of my
servlet are loaded.Classloaders will ask their parent for the class first before loading
it
themselves. So if the parent classloader somehow has visibility to
classes that your webpapp references, then it will get loaded by the
parent classloader.
I am in the middle of migrating an app from an older version of
Weblogic,
and
it would be helpful to have the ACTUAL class loading hierarchy welldocumented.
The basic hierarchy is all EJBs are in a root shared classloader and
each web application is loaded by a classloader that is a child of
that root.
Again, am I missing something here???My suspicion is that somehow these servlets are in the classpath ofthe
root classloader, so when the webapp classloaders delegate to thatone,
it will come up with the class.
mark
Mark Spotswood <[email protected]> wrote:
I believe what you are seeing is a bug in the servlet container.
The classloader organization is what you expect, but each webapp
is exporting the classpath information from its manifest to the
classloader above its classloader (which is common to all
three webapps) rather than to its own classloader. So because
of the delegation that happens with classloading, the common
parent classloader is the one that loads the class.
I believe that this behavior exists as an attempt to avoid
ClassCastExceptions, but I don't think that it is the right
solution to this problem. In our 8.1 release, this behavior
has been changed. That is, web applications no longer export
manifest classpath information to the parent of their classloader.
This change has not been ported back to the 7.x line, but a bug
report has been created (CR099889). You should be able to follow
up with support with this CR number.
mark
Mark Cotherman wrote:
I have read the BEA documentation on the class loader hierarchy
in
Weblogic Server,
and I have some questions regarding some behavior I am seeing.
I am running Weblogic Server 7.0.
I have an ear file that contains 3 web apps (wars) and several
utility
jars. The
web apps' manifests contain the Class-Path entry for the utility
jars.
My understanding
of this is that each web app SHOULD have its own class loader.
Also,
the utility
jars will be scoped in a separate class loader and WILL NOT have
visibility
to
the web app classes. The web app classes should have visibility
to
the utility
jars.
Is this correct????
I added a static segment of code in each web app and printed the
class
loader
for each servlet when it was loaded. I also printed the class loaderfrom a class
that is DEFINITELY contained in one of the utility jars. Here is
the
result:
Utility Class ClassLoader: sun.misc.Launcher$AppClassLoader@b9d04
Utility
Class
Parent ClassLoader: sun.misc.Launcher$ExtClassLoader@71732b
Servlet 1 ClassLoader: sun.misc.Launcher$AppClassLoader@b9d04 Servlet1 Parent
ClassLoader: sun.misc.Launcher$ExtClassLoader@71732b
Servlet 2 ClassLoader: sun.misc.Launcher$AppClassLoader@b9d04 Servlet2 Parent
ClassLoader: sun.misc.Launcher$ExtClassLoader@71732b
I'm a little confused.... I expected to see 3 different class loaders(i.e. one
for each class above). I believe the above printout says that all
3
classes are
being loaded by the SAME class loader instance
(Launcher$AppClassLoader@b9d04).
Am I interpreting this correctly? If so, what's going on? -
Application Class Loader problem calling virtual function
Hello everyone
I have run in to very strange behavior of JVM
I have created a class loader which allows my to load classes from
jar file, regardless that URLClassLoader supplies this functionality.
I am using this class loader to load some classes and call their virtual functions. The class diagram looks like that:
public interface I {
public void init();
public class AAA implements
public void init(){
public class BBB extends AAA{
public void init(){
//here comes implementation
}Interface I and class AAA are loaded with System Class loader and Class BBB is loaded using my class loader from jar file.
ByteStreamClassLoader classLoader = new ByteStreamClassLoader ();
Class cl = classLoader. loadClass(�com.product.BBB�,true);
I myInterface = cl.newInstance();
myInterface.init();The problem is that from some unknown reason java class AAA.init() instead of BBB.init().
Can somebody help me what am I doing wrong?
Class Loader code attached below
public class ByteStreamClassLoader extends ClassLoader {
protected HashMap m_cache = new HashMap();
public void clearCashe() {
m_cache = new HashMap();
private String definePackage(String className) {
StringBuilder strB = new StringBuilder();
//Class name must be removed from the URI in order to define a package
String[] packageArray = className.split("\\.");
for (int i = 0; i < packageArray.length - 1; i++) {
strB.append(packageArray).append(".");
String packageName = strB.toString();
packageName = packageName.substring(0, packageName.length() - 1);
if (getPackage(packageName) == null) {
m_logger.log(Level.FINEST, "Defining package '" + packageName + "'");
definePackage(packageName, null, null, null, null, null, null, null);
return packageName;
public synchronized Class loadClass(String name, boolean resolve) throws
ClassNotFoundException {
name = name.replaceAll("/", ".").replaceAll(".class", "");
//Try to locate the Class in cashe
Class c = (Class) m_cache.get(name);
//Try to locate the Class in the System Class Loader
if (c == null) {
try {
c = ClassLoader.getSystemClassLoader().loadClass(name);
catch (Exception ex) {}
else {
m_logger.log(Level.FINEST, "Class '" + name + "' found in cache");
//Load the class from byte array
if (c == null) {
String resourceName = name;
if (!resourceName.endsWith(".class")) {
resourceName = resourceName.concat(".class");
//Retrieve class byte representation
if (resourceName.indexOf(".") != -1) {
resourceName =
resourceName.replaceAll("\\.", "/").replaceAll("/class", ".class");
//Use the ByteStreamClassLoader to load the class from byte array
byte[] classByteArray = null;
try {
classByteArray = getResourceBytes(resourceName);
catch (IOException ex1) {
throw new ClassNotFoundException(
"Could not load class data." + ex1.getMessage());
m_logger.log(
Level.FINEST, "Loading class '" +
name + "' Byte Length: " + classByteArray.length);
String p = definePackage(name);
c = defineClass(
name,
classByteArray,
0,
classByteArray.length,
ByteStreamClassLoader.class.getProtectionDomain());
m_cache.put(name, c);
if (resolve) {
resolveClass(c);
return c;Hello everyone
I have run in to very strange behavior of JVM
I have created a class loader which allows my to load classes from
jar file, regardless that URLClassLoader supplies this functionality.
I am using this class loader to load some classes and call their virtual functions. The class diagram looks like that:
public interface I {
public void init();
public class AAA implements
public void init(){
public class BBB extends AAA{
public void init(){
//here comes implementation
}Interface I and class AAA are loaded with System Class loader and Class BBB is loaded using my class loader from jar file.
ByteStreamClassLoader classLoader = new ByteStreamClassLoader ();
Class cl = classLoader. loadClass(�com.product.BBB�,true);
I myInterface = cl.newInstance();
myInterface.init();The problem is that from some unknown reason java class AAA.init() instead of BBB.init().
Can somebody help me what am I doing wrong?
Class Loader code attached below
public class ByteStreamClassLoader extends ClassLoader {
protected HashMap m_cache = new HashMap();
public void clearCashe() {
m_cache = new HashMap();
private String definePackage(String className) {
StringBuilder strB = new StringBuilder();
//Class name must be removed from the URI in order to define a package
String[] packageArray = className.split("\\.");
for (int i = 0; i < packageArray.length - 1; i++) {
strB.append(packageArray).append(".");
String packageName = strB.toString();
packageName = packageName.substring(0, packageName.length() - 1);
if (getPackage(packageName) == null) {
m_logger.log(Level.FINEST, "Defining package '" + packageName + "'");
definePackage(packageName, null, null, null, null, null, null, null);
return packageName;
public synchronized Class loadClass(String name, boolean resolve) throws
ClassNotFoundException {
name = name.replaceAll("/", ".").replaceAll(".class", "");
//Try to locate the Class in cashe
Class c = (Class) m_cache.get(name);
//Try to locate the Class in the System Class Loader
if (c == null) {
try {
c = ClassLoader.getSystemClassLoader().loadClass(name);
catch (Exception ex) {}
else {
m_logger.log(Level.FINEST, "Class '" + name + "' found in cache");
//Load the class from byte array
if (c == null) {
String resourceName = name;
if (!resourceName.endsWith(".class")) {
resourceName = resourceName.concat(".class");
//Retrieve class byte representation
if (resourceName.indexOf(".") != -1) {
resourceName =
resourceName.replaceAll("\\.", "/").replaceAll("/class", ".class");
//Use the ByteStreamClassLoader to load the class from byte array
byte[] classByteArray = null;
try {
classByteArray = getResourceBytes(resourceName);
catch (IOException ex1) {
throw new ClassNotFoundException(
"Could not load class data." + ex1.getMessage());
m_logger.log(
Level.FINEST, "Loading class '" +
name + "' Byte Length: " + classByteArray.length);
String p = definePackage(name);
c = defineClass(
name,
classByteArray,
0,
classByteArray.length,
ByteStreamClassLoader.class.getProtectionDomain());
m_cache.put(name, c);
if (resolve) {
resolveClass(c);
return c; -
Custom applet class loader, how?
Fellow Java programmers;
I would like to load 'secure' class files (ie encrypted) into an applet at startup time.
I have code that does this for a normal java program.
How do you go about using a custom class loader in an applet?
Would something like this work? (using say *.Xclass local encrypted class files)
..somewhere in theapplet: init().. runClass()
.public void runClass(name)
{ aCL = new AppletClassLoader(); // extends ClassLoader
Class c = aCL.loadClass(name);
Method m= c.getMethod("main"..)
m.invoke(...);
Your comments or pehaps a code snippet would be appreciated.
Thanks, JohnJohn,
this does not work without modifying the runtime client environment.
Security constraints will prevent you from setting up a new class loader, so you will have to at least grant this permission in a policy file deployed to your clients as you will have to deplay the encryption keys.
As bringing in a new class loader from an applet is highly security critical, this should be backed by a rather strict policy and by signing the applet.
Though the example you provided might work, the class loader implementation itself is not so easy-
If you would like to imitate the findClass() and loadClass() methods from SUN you will see that those are complex and not suitable for "hooking" in an encrypted stream.
You might try an easier way:
Load the class data as an encrypted byte array, decrypt it and use SUNs class loader methods to define a JAVA class out of this byte array:
ClassLoader.defineClass(String�name, byte[]�b, int off, int�len)
This seems to be easier than implmenting your own loader.
Oliver -
Problem loading modified classes from CLASSPATH using system class loader
Hi,
I am facing problem to load the modified classes from CLASSPATH.
I have set my CLASSPATH to a directory whose classes will be modified frequently. After the server(web/app) is started, the system class loader, using which am trying to load the classes from the directory where the CLASSPATH is set, am not able to load the modified files without the server restart.
Do I need to have a custom class loader to fix this.
Please help me.
Thanks,
SureddyDo I need to have a custom class loader to fix this.Yes.
-
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 .. -
(Help) system classpath -Vs- the place where weblogic looks for classes
The following is my app's hierarchy.
myapp
|
|__myjsp.jsp
|
|__WEB-INF
|
|__classes
|_ MyClass.class
I am not able to use MyClass within myjsp.jsp
i.e. a scriplet like that shown below gives an error stating that MyClass isnt found
<% MyClass obj; %>
I've tried setting the system classpath, but to no avail.
Is there a difference between the system classpath and the place where weblogic looks for classes?
(I am running my app by creating a myapp.war file and placing it in autodeploy folder)Try moving your class to a named package and use the appropriate import statement in your JSP. Loading it from WEB-INF/classes/packagename should be fine so you might want to remove the other classpath mods you made to eliminate that uncertainty.
Here's a snippet from http://publib.boulder.ibm.com/infocenter/dmndhelp/v6rxmx/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/rweb_jsp_migration.html:
"As of JSP 2.0, referring to any classes from the unnamed or default package is not allowed. This can result in a translation error on some containers, specifically those that run in a JDK 1.4 or greater environment which will also break compatibility with some older JSP applications. However, as of JDK 1.4, importing classes from the unnamed package is not valid. See Java 2 Platform, Standard Edition Version 1.4.2 Compatibility with Previous Releases for details. Therefore, for forwards compatibility, applications must not rely on the unnamed package. This restriction also applies for all other cases where classes are referenced, such as when specifying the class name for a tag in a Tag Library Descriptor (TLD) file."
HTH,
Mike
Weblogic/J2EE Security Blog: http://monduke.com
Maybe you are looking for
-
Save and Save as... query
Hi, I'm using the following code to allow the user to save a string myString in file xml1.xml: var fileRef:FileReference=new FileReference(); fileRef.save(myString, "xml1.xml"); However, this pops a save dialog box every time and becomes tedi
-
ITunes store progress bar only proceeds half way.
The itunes store won't load. The status bar goes halfway and then the page does not load. Ive already updated to the newest version of iTunes, my computer is up to date, my norton 360 says iTunes is allowed, ive tried uninstalling all apple component
-
Expense reports are not processing for future date?
hi folks, in our co.expense reports are not processing for future date, even though the end date is one month from now the expense reports are not getting paid. can anybody assist me to come out of this issue. thanks in advance, regards bhanu
-
Different GRC Versions work in sap system
Hi All, Is it possible different Versions of GRC works in SAP SAP System. Means VIRSA CC 4.0 and FF 5.2 works in same System. But the GRC PATCHES Showing only GRC 5.2 Sp13 patche But not VIRSA CC 4.0 Patches. Regards VASU
-
Hello Using cs6 on windows 7, with program files on the operating ssd and media files on raided drive. I am working with files with weird formats (ripped from youtube). one of the big completely unresolvable problems ive had is that i cannot export w