[josm-dev] How do I add a new projection, EPSG:2924?

Frederik Ramm frederik at remote.org
Tue Feb 8 20:38:03 GMT 2011


Dirk,

Dirk Stöcker wrote:
> To make it simpler I added the addProjections() function myself in 
> r3872. I don't understand what is so complicated about this function 
> that 3 people failed to do it, one of them the original maintainer. :-)

I didn't know Imi was still on board ;)

Thank you for trying to help but it seems to me that things are not so 
easy.

The problem is that JOSM's class loader seems to prevent it from 
instantiating a class defined in a plugin. I wrote a plugin that 
provides a custom projection, FredProjection. In the plugin's 
constructor I call your addProjection() method. Just to be safe, I put a 
println in my plugin, and sure enough it prints:

loaded class org.openstreetmap.josm.plugins.fredprojection.FredProjection

But milliseconds later, as it executes line 359 of Main.java,

ProjectionPreference.setProjection();

it catches an exception:

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)
...

(the printStackTrace was added by me, normally it would only show a 
dialog saying "the projection cannot be loaded, using Mercator").

Initially I thought that was because the above happens in 
preConstructorInit() which is executed before loading plugins, but I 
have flagged my plugin as "Early Plugin" (<attribute name="Plugin-Early" 
value="true"/> in the Manifest), and these are loaded before the 
preConstructorInit.

So, even though my plugin is loaded, and indeed manages to add an 
instance of its projection to your projection list, the attempt to call

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.

Bye
Frederik

-- 
Frederik Ramm  ##  eMail frederik at remote.org  ##  N49°00'09" E008°23'33"



More information about the josm-dev mailing list