Using the updated apache-commons-codec seems to cause the plugin server to issue a call that causes arserver to crash. Here is the stack trace from the plugin server:
Exception in thread "job-scheduler" java.lang.NullPointerException at org.apache.commons.codec.binary.Base64.encode(Base64.java:380) at org.apache.commons.codec.binary.BaseNCodec.encode(BaseNCodec.java:340) at com.bmc.arsys.arencrypt.f.try(Unknown Source) at com.bmc.arsys.arencrypt.f.encryptData(Unknown Source) at com.bmc.arsys.arencrypt.PasswordEncryption.encryptPasswordEx(Unknown Source) at com.bmc.arsys.arencrypt.PasswordEncryption.encryptPasswordEx(Unknown Source) at com.bmc.arsys.arrpc.xdr.ArRpcPassword.setPasswordStr(Unknown Source) at com.bmc.arsys.api.session.g.a(Unknown Source) at com.bmc.arsys.api.ProxyJRpc.loadRpcControlStruct(Unknown Source) at com.bmc.arsys.api.ProxyJRpc.ARGetServerInfo(Unknown Source) at com.bmc.arsys.api.ARServerUser.getServerInfo(Unknown Source) at com.bmc.arsys.api.ARServerUser.getServerVersion(Unknown Source) at com.bmc.arsys.api.ARServerUser.getServerVersionMajor(Unknown Source) at com.bmc.arsys.api.ARServerUser.usePrivateRpcQueue(Unknown Source) at com.newyorklife.remedy.plugins.extractor.Job.run(Job.java:154) at java.util.TimerThread.mainLoop(Timer.java:512) at java.util.TimerThread.run(Timer.java:462) Which causes arserver to crash with this stack trace: Wed Feb 15 11:03:00 2012 11 Timestamp: 1329321780.4503 Thread Id: 76 Version: 7.5.00 Patch 003 200909292346 Apr 28 2010 14:12:04 ServerName: server Database: SQL -- Oracle Hardware: sun4u OS: SunOS 5.10 RPC Id: 15000 RPC Call: 73 (GLEWF) RPC Queue: 390621 Client: User Demo from Unidentified Client (protocol 14) at IP address 1.2.3.4 Logging On: API Escalation Filter SQL User Thread Stacks: ^@/path/to/ARSystem/bin/arserverd:DumpStackTrace+0x110 /path/to/ARSystem/bin/arserverd:SignalTrapProc+0x228 /lib/sparcv9/libc.so.1:0xd6fdc /lib/sparcv9/libc.so.1:0xcab70 /lib/sparcv9/libc.so.1:0xcad7c /path/to/ARSystem/bin/arserverd:VerifyControlRecord+0x7c8 [ Signal 11 (SEGV)] /path/to/ARSystem/bin/arserverd:0x47f81c /path/to/ARSystem/bin/arserverd:argetlistentrywithfields_14_svc+0xf4 /path/to/ARSystem/bin/arserverd:HandleRPCs+0x2c2f4 /path/to/ARSystem/bin/arserverd:WorkerThread+0xcb0 /path/to/ARSystem/bin/arserverd:RestartableThreadMain+0x88 /path/to/ARSystem/bin/arserverd:UnixThreadStartRoutine+0x17c /lib/sparcv9/libc.so.1:0xd6eb0 Guess I'm off to re-factor this class or write my own. Axton Grams On Wed, Feb 15, 2012 at 10:21 AM, Axton <[email protected]> wrote: > Still the same issue with this particular class. I see the following > in the plugin server logs when the plugin is initializing: > > Caused by: java.lang.NoSuchMethodError: > org.apache.commons.codec.binary.Base64.decodeBase64(Ljava/lang/String;)[B > at com.xxx.remedy.plugins.extractor.Job.setPassword(Job.java:642) > at com.xxx.remedy.plugins.extractor.Job.setFailsafeDefaults(Job.java:355) > at com.xxx.remedy.plugins.extractor.Config.configureJobs(Config.java:56) > at com.xxx.remedy.plugins.extractor.Config.<init>(Config.java:30) > at com.xxx.remedy.plugins.Extractor.init(Extractor.java:51) > ... 9 more > > The class path is set up with the directory that contains the jar that > has this class first in the class path: > > $ pargs 23237 > 23237: ./java -Dpname=PluginSvrMain -server -Xms128m -Xmx512m > -XX:PermSize=32m -XX:Max > argv[0]: ./java > argv[1]: -Dpname=PluginSvrMain > argv[2]: -server > argv[3]: -Xms128m > argv[4]: -Xmx512m > argv[5]: -XX:PermSize=32m > argv[6]: -XX:MaxPermSize=32m > argv[7]: -XX:+UseConcMarkSweepGC > argv[8]: -XX:-UseParNewGC > argv[9]: > -Djava.library.path=/path/to/lib:/path/to/pluginsvr:/path/to/ARSystem/bin:/path/to/api/lib > argv[10]: -Djava.awt.headless=true > argv[11]: -Dhttp.proxyHost=nyproxy > argv[12]: -Dhttp.proxyPort=80 > argv[13]: -Djava.security.policy=/path/to/jmx/server.policy > argv[14]: -Dcom.sun.management.jmxremote > argv[15]: -Dcom.sun.management.jmxremote.ssl=false > argv[16]: > -Dcom.sun.management.jmxremote.access.file=/path/to/jmx/jmxremote.access > argv[17]: -Dcom.sun.management.jmxremote.local.only=false > argv[18]: -Dcom.sun.management.jmxremote.port=1234 > argv[19]: > -Dcom.sun.management.jmxremote.password.file=/path/to/jmx/password.properties > argv[20]: -Dlog4j.configuration=/path/to/pluginsvr/log4j_pluginsvr.xml > argv[21]: -classpath > argv[22]: /path/to/lib:/path/to/pluginsvr:/path/to/pluginsvr/arpluginsvr75.jar > argv[23]: com.bmc.arsys.pluginsvr.ARPluginServerMain > argv[24]: -x > argv[25]: server > argv[26]: -i > argv[27]: /path/to/ARSystem > > The jar in /path/to/lib is commons-codec-1.6.jar. This file contains > the class that has the referenced method: > > $ jar -tvf /path/to/lib/commons-codec-1.6.jar |grep > Base64 > 8314 Fri Dec 02 21:37:14 EST 2011 > org/apache/commons/codec/binary/Base64.class > 929 Fri Dec 02 21:37:14 EST 2011 > org/apache/commons/codec/binary/Base64InputStream.class > 939 Fri Dec 02 21:37:14 EST 2011 > org/apache/commons/codec/binary/Base64OutputStream.class > > I think the problem is that the main jar (arpluginsvr75.jar) also > contains this particular class: > > $ jar -tvf /path/to/ARSystem/pluginsvr/arpluginsvr75.jar |grep Base64 > 5468 Sat Jul 10 16:13:00 EDT 2004 > org/apache/commons/codec/binary/Base64.class > > So that even though the jar file that contains the desired class comes > first in the classpath, the classloader is loading the classes from > the main jar (arpluginsvr75.jar) first. This has to do with the way > the plugin server initializes, such that it uses it's bundled > org/apache/commons/codec/binary/Base64.class over the one that comes > first in the classpath. > > I changed the classpath to reference the jar instead of the path to > the jar and this seems to have fixed the issue. I used the -verbose > option for the JRE to see where it was being loaded from and now I see > the following: > > [Loaded org.apache.commons.codec.binary.Base64 from > file:/path/to/lib/commons-codec-1.6.jar] > > Thanks for the pointers. > > We will see if this breaks anything in the plugin server. Maybe it > just be easier to write my own class to base64 encode/decode. > > Axton Grams > > On Tue, Feb 14, 2012 at 3:44 PM, LJ LongWing <[email protected]> wrote: >> Axton, >> I have experienced that if you have the same classes in multiple jar files, >> that it uses the one that's in the classpath first, first. So...if you add >> the newer versions of the classes in your jar first, then the plugin server >> jar file, that I believe it should use the new ones before the old ones. >> >> -----Original Message----- >> From: Action Request System discussion list(ARSList) >> [mailto:[email protected]] On Behalf Of Axton >> Sent: Tuesday, February 14, 2012 2:22 PM >> To: [email protected] >> Subject: Java Plugin Server - Class conflict >> >> I am trying to use Apache Commons Codec 1.6 in a plugin I am writing. >> The plugin server jar contains these classes, though an old version >> (too old to do what I would like to do): >> >> $ jar -tvf arpluginsvr75.jar |grep 'org/apache/commons/codec/' >> 0 Sun Sep 20 09:23:16 EDT 2009 org/apache/commons/codec/ >> 0 Sun Sep 20 09:23:16 EDT 2009 org/apache/commons/codec/binary/ >> 0 Sun Sep 20 09:23:16 EDT 2009 org/apache/commons/codec/digest/ >> 0 Sun Sep 20 09:23:16 EDT 2009 org/apache/commons/codec/language/ >> 0 Sun Sep 20 09:23:16 EDT 2009 org/apache/commons/codec/net/ >> 268 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/BinaryDecoder.class >> 268 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/BinaryEncoder.class >> 248 Sat Jul 10 16:13:00 EDT 2004 org/apache/commons/codec/Decoder.class >> 391 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/DecoderException.class >> 248 Sat Jul 10 16:13:00 EDT 2004 org/apache/commons/codec/Encoder.class >> 391 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/EncoderException.class >> 300 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/StringDecoder.class >> 300 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/StringEncoder.class >> 1190 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/StringEncoderComparator.class >> 5468 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/binary/Base64.class >> 2969 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/binary/BinaryCodec.class >> 2624 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/binary/Hex.class >> 704 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/binary/package.html >> 1860 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/digest/DigestUtils.class >> 708 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/digest/package.html >> 2470 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/language/DoubleMetaphone$DoubleMetaphoneResult.clas >> s >> 14791 Sat Jul 10 16:13:00 EDT 2004 >> org/apache/commons/codec/language/DoubleMetaphone.class >> 5050 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/language/Metaphone.class >> 2349 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/language/RefinedSoundex.class >> 3286 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/language/Soundex.class >> 1583 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/language/SoundexUtils.class >> 674 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/language/package.html >> 2661 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/net/BCodec.class >> 4052 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/net/QCodec.class >> 4511 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/net/QuotedPrintableCodec.class >> 2435 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/net/RFC1522Codec.class >> 252 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/net/StringEncodings.class >> 4432 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/net/URLCodec.class >> 696 Sat Jul 10 16:13:02 EDT 2004 >> org/apache/commons/codec/net/package.html >> 1022 Sat Jul 10 16:13:02 EDT 2004 org/apache/commons/codec/overview.html >> 3283 Sat Jul 10 16:13:02 EDT 2004 org/apache/commons/codec/package.html >> >> The problem is that the plugin resolves and uses the classes in the >> plugin server jar file, not the jar file I have referenced in my >> plugin server configuration: >> >> <plugin> >> <name>ARF.PLUGIN</name> >> <type>FilterAPI</type> >> <code>JAVA</code> >> <filename>/path/to/plugin.jar</filename> >> <classname>com.newyorklife.remedy.plugins.Extractor</classname> >> <pathelement type="location">/path/to/javacsv.jar</pathelement> >> <pathelement >> type="location">/path/to/commons-codec-1.6.jar</pathelement> >> <pathelement type="location">/path/to/mail.jar</pathelement> >> <pathelement >> type="location">/path/to/commons-lang3-3.1.jar</pathelement> >> <userDefined> >> <configfile>/path/to/config.properties</configfile> >> </userDefined> >> </plugin> >> >> Any ideas on how I can change the behavior of the classloader? Do I >> need to use something like java.lang.classloader? >> >> Thanks, >> Axton Grams >> >> ____________________________________________________________________________ >> ___ >> UNSUBSCRIBE or access ARSlist Archives at www.arslist.org >> attend wwrug12 www.wwrug12.com ARSList: "Where the Answers Are" >> >> _______________________________________________________________________________ >> UNSUBSCRIBE or access ARSlist Archives at www.arslist.org >> attend wwrug12 www.wwrug12.com ARSList: "Where the Answers Are" _______________________________________________________________________________ UNSUBSCRIBE or access ARSlist Archives at www.arslist.org attend wwrug12 www.wwrug12.com ARSList: "Where the Answers Are"

