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)


Reply via email to