[josm-dev] How do I add a new projection, EPSG:2924?
Petr Nejedlý
petr at nejedli.cz
Wed Feb 9 05:08:06 GMT 2011
Frederik Ramm wrote:
> Dirk,
[...]
>
> java.lang.ClassNotFoundException:
> org.openstreetmap.josm.plugins.fredprojection.FredProjection
> at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
> at java.security.AccessController.doPrivileged(Native Method)
> at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
> at java.lang.Class.forName0(Native Method)
> at java.lang.Class.forName(Class.java:169)
> at
> org.openstreetmap.josm.gui.preferences.ProjectionPreference.setProjection(ProjectionPreference.java:206)
[...]
>
> Class.forName(name).newInstance();
>
> for the name of my projection (which is derived from that very
> instance!) fails. I'm afraid that my Java skills stop there - somehow
> the default class loader does not know about classes added by plugins,
> and would need to be made aware of them.
There are two approaches possible for this problem.
The simpler one would be to change ProjectionPreference to not call
Class.forName(), but instead getProjections(), and iterate the
registered _instances_ until getClass().getName() matches.
The more complex, but generally preferable (as it would solve many
similar problems once for good) would be to code a delegating class
loader that would try to fulfill the load request by trying each
plugin's loader in sequence. This overall loader would be then set as
the context class loader of every thread. Similar to
http://hg.netbeans.org/main/file/tip/o.n.bootstrap/src/org/netbeans/ProxyClassLoader.java
but many many revisions ago (before the packageCoverage optimization was
implemented) and simplified...
Regards,
Nenik
More information about the josm-dev
mailing list