Brian, first, the value for jspwiki.plugin.externalJars should probably be an absolute path. And secondly, that could be the cause of the problem, you should not put your photocollection.jar in a directory that is already on tomcat's classpath (given it's name, /var/lib/tomcat7/lib looks like the lib folder for your classpath ?).
So, could you try something like /tmp/photocollection.jar ? kind regards, Harry On 25 February 2014 12:04, Brian Burch <br...@pingtoo.com> wrote: > On 24/02/14 19:21, Brian Burch wrote: > >> On 24/02/14 18:00, Harry Metske (JIRA) wrote: >> >>> >>> [ >>> https://issues.apache.org/jira/browse/JSPWIKI-812?page= >>> com.atlassian.jira.plugin.system.issuetabpanels:comment- >>> tabpanel&focusedCommentId=13910581#comment-13910581 >>> ] >>> >>> Harry Metske commented on JSPWIKI-812: >>> -------------------------------------- >>> >>> Brian, >>> >>> I have used this property in jspwiki-custom.properties only. And only >>> if I >>> needed to load a plugin from an "external jar". >>> Why would we need it in jspwiki.properties ? Why WikiJSPFilter ? >>> >> >> Sorry to confuse you Harry. My paranoia made me backup the exploded wiki >> directory /inside/ tomcat's webapps directory. Tomcat was trying to >> start the backup as well as the new version, with quite confusing >> results for me. >> >> I've read your original comments more carefully and am in the process of >> tidying up my own mess. Sorry to have bothered you, but thanks for >> replying so quickly. >> > > My question about Properties was triggered by the fact that I could not > make my plugin work when it's jar was placed outside jspwiki/WEB-INF/lib/, > i.e. in (/var/lib/tomcat7/lib). After some careful re-installation and > testing, my situation has not changed - but I have a lot more information > about what works and what doesn't. > > I am running on ubuntu 13.10, using java-7-openjdk-i386 (1.7.0_51) and > tomcat 7.0.52. JSPWIKI is at the latest trunk revision 1571366 (plus my > VersioningFileProvider patches). > > When I use my original jspwiki-custom.properties (as originally used with > tomcat 7.0.42 and jspwiki 2.10.0), and put my plugin jar in > jspwiki/WEB-INF/lib, the plugin works perfectly. In other words, I am no > longer panicking because my updated system works for me. > > > However, when I make these two changes: > a) add "jspwiki.plugin.externalJars = photocollection.jar" to > jspwiki-custom.properties. > b) move photocollection.jar from jspwiki.WEB-INF/lib to > ${CATALINA_BASE}/lib (i.e. from where jspwiki-custom.properties is already > being loaded). > > I get this Exception (which seems very similar to your original report): > > 2014-02-25 09:40:50,642 ERROR [org.apache.catalina.core. > ContainerBase.[Catalina].[www2.pingtoo.com].[/wiki]] Exception starting > filter WikiJSPFilter > > java.lang.NoClassDefFoundError: org/apache/wiki/api/plugin/WikiPlugin > at java.lang.ClassLoader.defineClass1(Native Method) > at java.lang.ClassLoader.defineClass(ClassLoader.java:800) > > at java.security.SecureClassLoader.defineClass( > SecureClassLoader.java:142) > at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) > at java.net.URLClassLoader.access$100(URLClassLoader.java:71) > at java.net.URLClassLoader$1.run(URLClassLoader.java:361) > at java.net.URLClassLoader$1.run(URLClassLoader.java:355) > at java.security.AccessController.doPrivileged(Native Method) > at java.net.URLClassLoader.findClass(URLClassLoader.java:354) > at java.lang.ClassLoader.loadClass(ClassLoader.java:425) > at java.lang.ClassLoader.loadClass(ClassLoader.java:358) > > at java.lang.Class.forName0(Native Method) > at java.lang.Class.forName(Class.java:270) > at org.apache.catalina.loader.WebappClassLoader.loadClass( > WebappClassLoader.java:1705) > at java.lang.ClassLoader.loadClass(ClassLoader.java:412) > at java.lang.ClassLoader.loadClass(ClassLoader.java:358) > at org.apache.wiki.util.ClassUtil.findClass(ClassUtil.java:117) > at org.apache.wiki.plugin.DefaultPluginManager.findPluginClass( > DefaultPluginManager.java:266) > at org.apache.wiki.plugin.DefaultPluginManager.newWikiPlugin( > DefaultPluginManager.java:788) > > at org.apache.wiki.parser.PluginContent.executeParse( > PluginContent.java:217) > at org.apache.wiki.parser.JSPWikiMarkupParser.handleHyperlinks( > JSPWikiMarkupParser.java:1467) > at org.apache.wiki.parser.JSPWikiMarkupParser.handleOpenbracket( > JSPWikiMarkupParser.java:2269) > at org.apache.wiki.parser.JSPWikiMarkupParser.parseToken( > JSPWikiMarkupParser.java:2844) > at org.apache.wiki.parser.JSPWikiMarkupParser.fillBuffer( > JSPWikiMarkupParser.java:2643) > at org.apache.wiki.parser.JSPWikiMarkupParser.parse( > JSPWikiMarkupParser.java:2916) > at org.apache.wiki.WikiEngine.textToHTML(WikiEngine.java:1654) > at org.apache.wiki.WikiEngine.scanWikiLinks(WikiEngine.java:1558) > at org.apache.wiki.ReferenceManager.updatePageReferences( > ReferenceManager.java:193) > at org.apache.wiki.ReferenceManager.initialize( > ReferenceManager.java:299) > > at org.apache.wiki.WikiEngine.initReferenceManager( > WikiEngine.java:728) > at org.apache.wiki.WikiEngine.initialize(WikiEngine.java:623) > at org.apache.wiki.WikiEngine.<init>(WikiEngine.java:430) > at org.apache.wiki.WikiEngine.getInstance(WikiEngine.java:370) > at org.apache.wiki.ui.WikiServletFilter.init( > WikiServletFilter.java:82) > at org.apache.wiki.ui.WikiJSPFilter.init(WikiJSPFilter.java:88) > at org.apache.catalina.core.ApplicationFilterConfig.initFilter( > ApplicationFilterConfig.java:279) > at org.apache.catalina.core.ApplicationFilterConfig.getFilter( > ApplicationFilterConfig.java:260) > at org.apache.catalina.core.ApplicationFilterConfig.<init> > (ApplicationFilterConfig.java:105) > at org.apache.catalina.core.StandardContext.filterStart( > StandardContext.java:4809) > at org.apache.catalina.core.StandardContext.startInternal( > StandardContext.java:5485) > at org.apache.catalina.util.LifecycleBase.start( > LifecycleBase.java:150) > at org.apache.catalina.manager.ManagerServlet.start( > ManagerServlet.java:1256) > at org.apache.catalina.manager.HTMLManagerServlet.start( > HTMLManagerServlet.java:692) > at org.apache.catalina.manager.HTMLManagerServlet.doPost( > HTMLManagerServlet.java:217) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) > at org.apache.catalina.core.ApplicationFilterChain. > internalDoFilter(ApplicationFilterChain.java:303) > at org.apache.catalina.core.ApplicationFilterChain.doFilter( > ApplicationFilterChain.java:208) > at org.apache.catalina.filters.CsrfPreventionFilter.doFilter( > CsrfPreventionFilter.java:213) > at org.apache.catalina.core.ApplicationFilterChain. > internalDoFilter(ApplicationFilterChain.java:241) > at org.apache.catalina.core.ApplicationFilterChain.doFilter( > ApplicationFilterChain.java:208) > at org.apache.tomcat.websocket.server.WsFilter.doFilter( > WsFilter.java:52) > at org.apache.catalina.core.ApplicationFilterChain. > internalDoFilter(ApplicationFilterChain.java:241) > at org.apache.catalina.core.ApplicationFilterChain.doFilter( > ApplicationFilterChain.java:208) > at org.apache.catalina.filters.SetCharacterEncodingFilter. > doFilter(SetCharacterEncodingFilter.java:108) > at org.apache.catalina.core.ApplicationFilterChain. > internalDoFilter(ApplicationFilterChain.java:241) > at org.apache.catalina.core.ApplicationFilterChain.doFilter( > ApplicationFilterChain.java:208) > at org.apache.catalina.core.StandardWrapperValve.invoke( > StandardWrapperValve.java:220) > at org.apache.catalina.core.StandardContextValve.invoke( > StandardContextValve.java:122) > at org.apache.catalina.authenticator.AuthenticatorBase.invoke( > AuthenticatorBase.java:610) > at org.apache.catalina.core.StandardHostValve.invoke( > StandardHostValve.java:170) > at org.apache.catalina.valves.ErrorReportValve.invoke( > ErrorReportValve.java:98) > at org.apache.catalina.authenticator.SingleSignOn. > invoke(SingleSignOn.java:339) > at org.apache.catalina.valves.AccessLogValve.invoke( > AccessLogValve.java:950) > at org.apache.catalina.core.StandardEngineValve.invoke( > StandardEngineValve.java:116) > at org.apache.catalina.connector.CoyoteAdapter.service( > CoyoteAdapter.java:408) > at org.apache.coyote.http11.AbstractHttp11Processor.process( > AbstractHttp11Processor.java:1040) > at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler. > process(AbstractProtocol.java:607) > at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor. > doRun(NioEndpoint.java:1721) > at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor. > run(NioEndpoint.java:1679) > > at java.util.concurrent.ThreadPoolExecutor.runWorker( > ThreadPoolExecutor.java:1145) > at java.util.concurrent.ThreadPoolExecutor$Worker.run( > ThreadPoolExecutor.java:615) > at java.lang.Thread.run(Thread.java:744) > > Caused by: java.lang.ClassNotFoundException: org.apache.wiki.api.plugin. > WikiPlugin > at java.net.URLClassLoader$1.run(URLClassLoader.java:366) > at java.net.URLClassLoader$1.run(URLClassLoader.java:355) > at java.security.AccessController.doPrivileged(Native Method) > at java.net.URLClassLoader.findClass(URLClassLoader.java:354) > at java.lang.ClassLoader.loadClass(ClassLoader.java:425) > at java.lang.ClassLoader.loadClass(ClassLoader.java:358) > ... 73 more > > (there are a lot of wiki pages that want to use my plugin!!!) > > I have hung a debugger onto the tomcat system when the jspwiki webapp > starts running. > > DefaultPluginManager.findPluginClass looks OK to me: > * m_externalJars is [photocollection.jar] in agreement with my new > property. > * m_searchPath is [com.pingtoo.jspwiki.plugin, org.apache.wiki.plugin, > org.apache.wiki.forms] in agreement with my (unchanged from the original) > jspwiki.plugin.searchPath property. > > When it calls ClassUtil.findClass, the initial loader.loadClass gets a > ClassNotFoundException (as expected, I think). The catch block then starts > to iterate through the searchPath packages, looking for alternative > fully-qualified package names that might apply to my plugin class. The > first one it tries ought to be correct - com.pingtoo.jspwiki.plugin. > PhotoCollectionPlugin. > > After stepping into the URLClassloader, a NoClassDefFoundError is caught > at a higher point in the call stack, reporting the > java.lang.NoClassDefFoundError: > org/apache/wiki/api/plugin/WikiPlugin. > > > I tried a couple of nasty hacks: > ** I /copied/ jspwiki-war-2.10.1-SNAPSHOT.jar into /var/lib/tomcat7/lib > > 2014-02-25 10:33:27,032 ERROR [org.apache.wiki.tags.WikiTagBase] Tag > failed > java.lang.ClassCastException: org.apache.wiki.WikiContext cannot be cast > to org.apache.wiki.WikiContext > at org.apache.wiki.tags.WikiTagBase.doStartTag( > WikiTagBase.java:81) > at org.apache.jsp.templates.photoCollection.Header_jsp._ > jspx_meth_photo_005fPhotoPageName_005f0(Header_jsp.java:365) > at org.apache.jsp.templates.photoCollection.Header_jsp._ > jspService(Header_jsp.java:214) > at org.apache.jasper.runtime.HttpJspBase.service( > HttpJspBase.java:70) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) > <snip/> > 2014-02-25 10:33:27,036 ERROR [org.apache.wiki.tags.WikiTagBase] Tag > failed, check logs: org.apache.wiki.WikiContext cannot be cast to > org.apache.wiki.WikiContext > > ** I /moved/ jspwiki-war-2.10.1-SNAPSHOT.jar into /var/lib/tomcat7/lib > > 2014-02-25 10:39:15,437 ERROR [org.apache.catalina.core.ContainerBase] > ContainerBase.addChild: start: > org.apache.catalina.LifecycleException: Failed to start component > [StandardEngine[Catalina].StandardHost[www2.pingtoo.com] > .StandardContext[/wiki]] > at org.apache.catalina.util.LifecycleBase.start( > LifecycleBase.java:154) > > at org.apache.catalina.core.ContainerBase.addChildInternal( > ContainerBase.java:901) > at org.apache.catalina.core.ContainerBase.addChild( > ContainerBase.java:877) > at org.apache.catalina.core.StandardHost.addChild( > StandardHost.java:632) > at org.apache.catalina.startup.HostConfig.deployDescriptor( > HostConfig.java:670) > <snip/> > Caused by: java.lang.NoClassDefFoundError: org/apache/xmlrpc/XmlRpcContext > at java.lang.Class.getDeclaredFields0(Native Method) > at java.lang.Class.privateGetDeclaredFields(Class.java:2397) > at java.lang.Class.getDeclaredFields(Class.java:1806) > <snip/> > 2014-02-25 10:39:15,444 ERROR [org.apache.catalina.startup.HostConfig] > Error deploying configuration descriptor /etc/tomcat7/Catalina/www2. > pingtoo.com/wiki.xml > > > I am out of my personal ClassLoader-depth here! When I use the > configuration you suggest, it seems the ClassLoader actually finds my > plugin class in my jar. > > My PhotoCollection class implements WikiPlugin, it has: > import org.apache.wiki.WikiContext; > import org.apache.wiki.WikiEngine; > import org.apache.wiki.api.exceptions.PluginException; > import org.apache.wiki.api.exceptions.ProviderException; > import org.apache.wiki.api.plugin.WikiPlugin; > import org.apache.wiki.util.TextUtil; > > I suspect the problem arises because the classloader that finds my plugin > is not able to find these imported classes. When I try my two hacks, it > finds the imported classes but I either end up with 2 copies under > different classloader instances, or some of them become invisible. > > Of course, I hope the true explanation is much simpler.... I've perhaps > configured something wrong. In the ideal world I would write a new unit > test to examine the problem, but I don't think that is within my capability. > > Can you suggest how I can either diagnose, or resolve this problem, please? > > Thanks, > > Brian > > > Brian >> >> regards, >>> Harry >>> >>> >>> >>> >>> >>> >>> plugin jars should be loadable from outside the war >>>> --------------------------------------------------- >>>> >>>> Key: JSPWIKI-812 >>>> URL: https://issues.apache.org/jira/browse/JSPWIKI-812 >>>> Project: JSPWiki >>>> Issue Type: Improvement >>>> Components: Plugins >>>> Affects Versions: 2.9, 2.9.1, 2.10 >>>> Environment: Ubuntu Linux Mint 14 Nadia >>>> Java(TM) SE Runtime Environment (build 1.7.0_25-b15) >>>> JSPWiki 2.10.0 >>>> Reporter: Harry Metske >>>> Assignee: Harry Metske >>>> Fix For: 2.10.1 >>>> >>>> Attachments: JSPWIKI-812.patch >>>> >>>> >>>> I stumbled upon this bug while testing a non-core plugin. >>>> To reproduce : >>>> * add the plugin jar tomcat's lib directory (not the WEB-INF/lib dir >>>> of jspwiki) >>>> * update the jspwiki.plugin.searchPath property to include the >>>> plugin's package name >>>> * create a page that references the page >>>> * restart your wiki >>>> It will not initialize and throw the following exception : >>>> {noformat} >>>> Jan 18, 2014 1:20:24 PM org.apache.catalina.core.StandardContext >>>> filterStart >>>> SEVERE: Exception starting filter WikiJSPFilter >>>> java.lang.NoClassDefFoundError: org/apache/wiki/api/plugin/WikiPlugin >>>> at java.lang.ClassLoader.defineClass1(Native Method) >>>> at java.lang.ClassLoader.defineClass(ClassLoader.java:792) >>>> at >>>> java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) >>>> at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) >>>> at java.net.URLClassLoader.access$100(URLClassLoader.java:71) >>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:361) >>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:355) >>>> at java.security.AccessController.doPrivileged(Native Method) >>>> at java.net.URLClassLoader.findClass(URLClassLoader.java:354) >>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:424) >>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:357) >>>> at java.lang.Class.forName0(Native Method) >>>> at java.lang.Class.forName(Class.java:270) >>>> at >>>> org.apache.catalina.loader.WebappClassLoader.loadClass( >>>> WebappClassLoader.java:1700) >>>> >>>> at >>>> org.apache.catalina.loader.WebappClassLoader.loadClass( >>>> WebappClassLoader.java:1558) >>>> >>>> at org.apache.wiki.util.ClassUtil.findClass(ClassUtil.java:103) >>>> at >>>> org.apache.wiki.plugin.DefaultPluginManager.findPluginClass( >>>> DefaultPluginManager.java:256) >>>> >>>> at >>>> org.apache.wiki.plugin.DefaultPluginManager.newWikiPlugin( >>>> DefaultPluginManager.java:769) >>>> >>>> at >>>> org.apache.wiki.parser.PluginContent.executeParse( >>>> PluginContent.java:217) >>>> >>>> at >>>> org.apache.wiki.parser.JSPWikiMarkupParser.handleHyperlinks( >>>> JSPWikiMarkupParser.java:1467) >>>> >>>> at >>>> org.apache.wiki.parser.JSPWikiMarkupParser.handleOpenbracket( >>>> JSPWikiMarkupParser.java:2269) >>>> >>>> at >>>> org.apache.wiki.parser.JSPWikiMarkupParser.parseToken( >>>> JSPWikiMarkupParser.java:2844) >>>> >>>> at >>>> org.apache.wiki.parser.JSPWikiMarkupParser.fillBuffer( >>>> JSPWikiMarkupParser.java:2643) >>>> >>>> at >>>> org.apache.wiki.parser.JSPWikiMarkupParser.parse( >>>> JSPWikiMarkupParser.java:2916) >>>> >>>> at >>>> org.apache.wiki.providers.CachingProvider.refreshMetadata( >>>> CachingProvider.java:441) >>>> >>>> at >>>> org.apache.wiki.providers.CachingProvider.getPageInfo( >>>> CachingProvider.java:484) >>>> >>>> at org.apache.wiki.PageManager.getPageInfo(PageManager.java:420) >>>> at org.apache.wiki.WikiEngine.getPage(WikiEngine.java:1892) >>>> at org.apache.wiki.WikiEngine.getPage(WikiEngine.java:1872) >>>> at >>>> org.apache.wiki.ReferenceManager.initialize(ReferenceManager.java:267) >>>> at >>>> org.apache.wiki.WikiEngine.initReferenceManager(WikiEngine.java:728) >>>> at org.apache.wiki.WikiEngine.initialize(WikiEngine.java:623) >>>> at org.apache.wiki.WikiEngine.<init>(WikiEngine.java:430) >>>> at org.apache.wiki.WikiEngine.getInstance(WikiEngine.java:370) >>>> at >>>> org.apache.wiki.ui.WikiServletFilter.init(WikiServletFilter.java:82) >>>> at org.apache.wiki.ui.WikiJSPFilter.init(WikiJSPFilter.java:88) >>>> at >>>> org.apache.catalina.core.ApplicationFilterConfig.initFilter( >>>> ApplicationFilterConfig.java:281) >>>> >>>> at >>>> org.apache.catalina.core.ApplicationFilterConfig.getFilter( >>>> ApplicationFilterConfig.java:262) >>>> >>>> at >>>> org.apache.catalina.core.ApplicationFilterConfig.<init> >>>> (ApplicationFilterConfig.java:107) >>>> >>>> at >>>> org.apache.catalina.core.StandardContext.filterStart( >>>> StandardContext.java:4746) >>>> >>>> at >>>> org.apache.catalina.core.StandardContext.startInternal( >>>> StandardContext.java:5399) >>>> >>>> at >>>> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) >>>> at >>>> org.apache.catalina.core.ContainerBase.addChildInternal( >>>> ContainerBase.java:901) >>>> >>>> at >>>> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) >>>> at >>>> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) >>>> at >>>> org.apache.catalina.startup.HostConfig.deployDirectory( >>>> HostConfig.java:1114) >>>> >>>> at >>>> org.apache.catalina.startup.HostConfig$DeployDirectory. >>>> run(HostConfig.java:1673) >>>> >>>> at >>>> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) >>>> at >>>> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) >>>> at java.util.concurrent.FutureTask.run(FutureTask.java:166) >>>> at >>>> java.util.concurrent.ThreadPoolExecutor.runWorker( >>>> ThreadPoolExecutor.java:1145) >>>> >>>> at >>>> java.util.concurrent.ThreadPoolExecutor$Worker.run( >>>> ThreadPoolExecutor.java:615) >>>> >>>> at java.lang.Thread.run(Thread.java:724) >>>> Caused by: java.lang.ClassNotFoundException: >>>> org.apache.wiki.api.plugin.WikiPlugin >>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:366) >>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:355) >>>> at java.security.AccessController.doPrivileged(Native Method) >>>> at java.net.URLClassLoader.findClass(URLClassLoader.java:354) >>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:424) >>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:357) >>>> ... 53 more >>>> {noformat} >>>> If you undo one of the three steps, problem is solved. >>>> Also, if you move (not copy) the plugin jar to jspwiki's WEB-INF/lib >>>> directory, the problem does not occur. >>>> We want to stay away from war surgery and therefore having plugin >>>> jars in tomcat's lib directory should be possible. >>>> >>> >>> >>> >>> -- >>> This message was sent by Atlassian JIRA >>> (v6.1.5#6160) >>> >>> >