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)