[prev in list] [next in list] [prev in thread] [next in thread]
List: tapestry-user
Subject: Re: Classloader issues under JBoss 6.X - 7.X - Patch Included
From: Christian Riedel <cr.mlist () googlemail ! com>
Date: 2017-12-03 18:57:25
Message-ID: 634BB3CF-5236-423B-91CC-13979369497C () googlemail ! com
[Download RAW message or body]
Nice job!
I think the general path to get things patched is to open a Jira issue and attach a \
proper patch file, possibly including a test. The committers can't use your code \
otherwise for apache license reasons IIRC…
Cheers
Christian
> Am 01.12.2017 um 17:38 schrieb Luca Arzeni <l.arzeni@iname.com>:
>
> Hi to all,
> few years ago, I raised an alert concerning the compatibility between Tapestry5 and \
> JBoss; the thread was:
> "Is tapestry plastic incompatible with JEE specs?"
>
> https://mail-archives.apache.org/mod_mbox/tapestry-users/201512.mbox/%3Ctrinity-fc3b0e36-0402-4d71-b48a-4a464cbd6474-1449857158334@3capp-mailcom-lxa14%3E
>
> At that time I found a workaround and concluded that there was no way to solve the \
> issue, thinking that was a problem related to the jboss classloader (or, more \
> generally, between an appserver classloader and the behaviour of plastic).
> Few days ago, working on a new project under JBoss 7.0.0.GA, I was again badly \
> hitted by this problem, but this time I investigated more thoroughly the issue and \
> I found the source of all evil: the class \
> "org.apache.tapestry5.internal.plastic.asm.ClassWriter" of plastic.
> The classloader used to find (and load) the classes by plastic is really not \
> compatible with an appserver. An appserver is required to enforce classloaded \
> isolation and plastic ignores this. Anyway plastic can be patched to solve the \
> issue; here I attach a patch, please I ask to some developer to kindly forward and \
> apply this patch to the 5.4.x branch and to the 5.5.
> I also want to give thanks to these guys to help me to focus the problem:
>
> https://stackoverflow.com/questions/42423907/unable-to-move-tapestry-jars-out-of-the-war-with-page-code-inside-the-war-still
> https://blog.progs.be/50/tapestry-classloading-problems-on-jboss
>
> Regards,
> Luca Arzeni
>
>
> *** Here is the original code: ***
>
> 1752 protected String getCommonSuperClass(final String type1, final String \
> type2) { 1753 Class<?> c, d;
> 1754 ClassLoader classLoader = getClass().getClassLoader();
> 1755 try {
> 1756 c = Class.forName(type1.replace('/', '.'), false, classLoader);
> 1757 d = Class.forName(type2.replace('/', '.'), false, classLoader);
> 1758 } catch (Exception e) {
> 1759 throw new RuntimeException(e.toString());
> 1760 }
> 1761 if (c.isAssignableFrom(d)) {
> 1762 return type1;
> 1763 }
> 1764 if (d.isAssignableFrom(c)) {
> 1765 return type2;
> 1766 }
> 1767 if (c.isInterface() || d.isInterface()) {
> 1768 return "java/lang/Object";
> 1769 } else {
> 1770 do {
> 1771 c = c.getSuperclass();
> 1772 } while (!c.isAssignableFrom(d));
> 1773 return c.getName().replace('.', '/');
> 1774 }
> 1775 }
>
> *** Here is the patch: ***
>
> 1752 protected String getCommonSuperClass(final String type1, final String \
> type2) { 1753 Class<?> c, d;
> 1754 ClassLoader classLoader = getClass().getClassLoader();
> 1755 try {
> 1756 c = Class.forName(type1.replace('/', '.'), false, classLoader);
> 1757 d = Class.forName(type2.replace('/', '.'), false, classLoader);
> 1758 } catch (Exception e) {
> // --- ARZILLO PATCH BEGIN \
> -----------------------------------------------------------
> System.err.println("WARNING: type1:" + type1 + ", type2: " + type2 + ", \
> exception: " + e + ", classLoader: " + classLoader +", attempting to use the \
> classloader of the current thread");
> classLoader = Thread.currentThread().getContextClassLoader();
> if ( classLoader != null ) {
>
> try {
> c = Class.forName(type1.replace('/', '.'), false, classLoader);
> d = Class.forName(type2.replace('/', '.'), false, classLoader);
> }
> catch (Exception e_inner) {
> System.err.println("ERROR 1: type1:" + type1 + ", type2: " + type2 + ", e_inner: \
> " + e_inner + ", classLoader: " + classLoader +", failed even using the classloader \
> of the current thread"); throw new RuntimeException(e_inner.toString());
> }
> }
> else {
> System.err.println("ERROR 2: type1:" + type1 + ", type2: " + type2 + ", \
> exception: " + e + ", classLoader: " + classLoader +", unable to get the \
> classloader of the current thread"); throw new RuntimeException(e.toString());
> }
> // --- ARZILLO PATCH END \
> ----------------------------------------------------------- 1760 }
> 1761 if (c.isAssignableFrom(d)) {
> 1762 return type1;
> 1763 }
> 1764 if (d.isAssignableFrom(c)) {
> 1765 return type2;
> 1766 }
> 1767 if (c.isInterface() || d.isInterface()) {
> 1768 return "java/lang/Object";
> 1779 } else {
> 1770 do {
> 1771 c = c.getSuperclass();
> 1772 } while (!c.isAssignableFrom(d));
> 1773 return c.getName().replace('.', '/');
> 1774 }
> 1775 }
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic