libgcj failure: Duplicate class registration
Hannes Wallnoefer
hannes@helma.at
Thu Mar 18 21:51:00 GMT 2004
Hannes Wallnoefer wrote:
> Tom Tromey wrote:
>
>>
>> With the current gcj, a given compiled class can only be loaded once
>> by the system class loader. If you try to link in a class more than
>> once, you get this failure.
>>
>> This choice was the result of a lot of discussion a few years ago, see
>> the list archives for the details. (I don't have a ready pointer to
>> the thread, sorry.)
>>
>
> I found that the problem is Apache is calling dlopen() twice for each
> shared module. This is done on purpose to let modules set up their
> logs files or whatever. So I guess the only solution is to put the
> Java classes in a separate library and load that manually from my
> module. Unless there is a way to "forget" about the classes loaded in
> the first dlopen() pass, but I somehow doubt this.
>
Thinking about this some more it actually seems like an unnecessary
restriction that shared libraries can only be dlopen()ed once by the
same classloader. I think the check for already loaded classes in the
system classloader is to prevent system classes from being overwritten
by classes defined in some other file, which surely is a good thing. But
in this case we're loading the same library file again, so this is not
an issue. Wouldn't the right thing to do in this case to just keep track
of already loaded shared libraries in the classloader and simply ignore
multiple calls to already linked libraries?
Hannes
More information about the Java
mailing list