第二步:创建netshop web应用
问题出现:
2004-12-23 19:46:38 StandardContext[/netshop]Exception sending context initialized event to listener instance of class org.softme.triones.TrionesContextListener
java.lang.Error: factory already defined
at java.net.URL.setURLStreamHandlerFactory(Unknown Source)
at org.eclipse.osgi.framework.internal.core.Framework.initialize(Framework.java:154)
at org.eclipse.osgi.framework.internal.core.Framework.<init>(Framework.java:95)
at org.eclipse.osgi.framework.internal.core.OSGi.createFramework(OSGi.java:90)
at org.eclipse.osgi.framework.internal.core.OSGi.<init>(OSGi.java:31)
at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:215)
at org.softme.triones.launcher.TrionesStarter.basicRun(TrionesStarter.java:1063)
at org.softme.triones.launcher.TrionesStarter.launch(TrionesStarter.java:672)
at org.softme.triones.TrionesContextListener.contextInitialized(TrionesContextListener.java:51)
原因:在一个虚拟机中,该方法只能被调用一次。
参考:
“java.net.URL是各种协议,包括已知和未知的入口,通过URL.setURLStreamHandlerFactory(URLStreamHandlerFactory handlerFactory)方法可以设置新的协议处理器的工厂类的实例,在一个虚拟机中,该方法只能被调用一次。除了利用这种方式向系统注册外,还可以通过设置系统属性java.handler.protol.pkg或者sun.net.www.protocol来实现注册。系统会按照setURLStreamHandlerFactory()、java.handler.protol.pkg、sun.net.www.protocol三种方法,从高优先级到低优先级的进行搜索特定协议对应的处理器。java.handler.protol.pkg对应的值的构成是用|分隔的各个协议处理器的类,格式为..Handler | ..Handler | ...。sun.net.www.protocol的设置方式是sun.net.www.protocol..Handler,这个sun.net.www.protocol..Handler会被追加到第二种方式得到的值后面,然后逐个加载。注意,设置属性的时候,只需要写上handler的package中protocol之前的部分,例如对于myProtocol协议,则,myProtocol的处理器的类命名格式为myPackage.myProtocol.Handler,或者是sun.net.www.protocol.myProtocol.Handler,设置属性的时候,只需要写上myPackage即可,剩下的部分,URL类会自动处理的。
看样子必须改回用反射来初始化框架了。
改回成反射调用的模式依然出现以上错误,看来可能是与tomcat发生了冲突,先下tomcat的源码等明天查查看。