I run a java application packaged in A.jar, in which some classes in B.jar are used.
All related jars are placed in a specific directory, which is included in the classpath.
The program is like this:
main(){
run method ClassA.M1() in A.jar; //the method may keep running for 2 minutes
do some other prepare;
call method ClassB.M2 in B.jar;
}
When the program is running M1, I manually replaced B.jar with a newer version(the name is also B.jar).
But, the program throw ClassNotFoundException.
Then, start the program again, and it works fine.
so, my question is: why the ClassNotFoundException is thrown, as the jar path and jar name is not changed, the classloader should load it without any troubles.
Give me some directions please.
You cannot simply change jar files during runtime by replacing them with ones having the same name, because the class loader might have already loaded some classes from it.
If you need to support such behavior, you need to look into libraries or frameworks that would provide hot replace mechanisms.
Here are two articles to help you understand class loaders better:
(1996)
(2001)
There are plenty more articles on this subject and even related questions here on the Stack OverFlow, I recommend you read more.