Forum OpenACS Q&A: Webmail progress & problems
I have two webmail configurations to report on, one of which appears to work without a hitch, and the other of which results in a segmentation violation.
The first configuration, which I'm pretty sure I can report success on, is:
- Red Hat 6.2 (linux 2.2.14)
- JDK 1.3 (not sure which vendor)
- Open ACS 3.2.4
- Aolserver 3.2
- Postgresql 7.0.x
The second configuration, which gives me a segmentation violation when I try to send email (to myself, in the domain defined in /var/qmail/control/virtualdomains) via the webmail interface, is:
- SuSE 7.0 (linux 2.2.16, I think?)
- JDK 1.1.8 (Blackdown)
- Open ACS 3.2.4
- Aolserver 3.2
- Postgresql 7.0.x
I've included portions of the server log below. The segmentation violation is at the end.
Any ideas as to how to troubleshoot this?
[12/Feb/2001:21:52:56][614.1024][-main-] Notice: modload: loading '/usr/local/aolserver/bin/libnsjava.so'
[12/Feb/2001:21:52:56][614.1024][-main-] Notice: ModuleInit: Java module ENABLED
[Loaded java/lang/Thread.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Object.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Class.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/String.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/Serializable.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/ThreadDeath.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Error.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Throwable.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Exception.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/RuntimeException.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Cloneable.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Runnable.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/ThreadGroup.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/StringBuffer.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/System.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Integer.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Number.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/NoClassDefFoundError.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/LinkageError.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/OutOfMemoryError.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/VirtualMachineError.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/util/Properties.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/util/Hashtable.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/util/Dictionary.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/util/HashtableEntry.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/FileInputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/InputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/FileDescriptor.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/FileOutputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/OutputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/BufferedInputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/FilterInputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/PrintStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/FilterOutputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/BufferedOutputStream.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/OutputStreamWriter.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/Writer.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded sun/io/CharToByteConverter.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded sun/io/CharacterEncoding.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/util/Locale.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Character.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded sun/io/CharToByteISO8859_1.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/io/BufferedWriter.class from /usr/lib/jdk118_v1/lib/classes.zip]
[Loaded java/lang/Compiler.class from /usr/lib/jdk118_v1/lib/classes.zip]
[12/Feb/2001:21:52:57][614.1024][-main-] Notice: ModuleInit: JVM init succeeded!
[12/Feb/2001:21:52:57][614.1024][-main-] Notice: tclinit: sourcing '/usr/local/aolserver/modules/tcl/init.tcl'
[12/Feb/2001:21:52:57][614.1024][-main-] Notice: tclinit: sourcing '/usr/local/aolserver/modules/tcl/debug.tcl'
[12/Feb/2001:21:52:57][614.1024][-main-] Notice: tclinit: sourcing '/usr/local/aolserver/modules/tcl/fastpath.tcl'
[12/Feb/2001:21:52:57][614.1024][-main-] Notice: tclinit: sourcing '/usr/local/aolserver/modules/tcl/file.tcl'
...
[12/Feb/2001:21:53:06][614.6151][-conn0-] Notice: Querying ' select user_id, token, secure_token, last_ip, last_hit from sec_sessions where session_id = 361;'[12/Feb/2001:21:53:06][614.6151][-conn0-] Notice: dbinit: sql(localhost::ruchirasala): '
select user_id, token, secure_token, last_ip, last_hit from sec_sessions where session_id = 361 ' SIGSEGV 11* segmentation violationFull thread dump: "SIGQUIT handler" (TID:0x406532a0, sys_thread_t:0x815c2c0, state:R, thread_t: t@4101, sp:0x0 threadID:0x26b, stack_base:0xbf1ffce0, stack_size:0x200000) prio=46
"Finalizer thread" (TID:0x40653088, sys_thread_t:0x815c180, state:CW, thread_t: t@3076, sp:0x0 threadID:0x26a, stack_base:0xbf3ffce0, stack_size:0x200000) prio=46
"main" (TID:0x406530b0, sys_thread_t:0x81426f8, state:R, thread_t: t@2051, sp:0x0 threadID:0x269, stack_base:0x0, stack_size:0x200000) prio=46
Monitor Cache Dump:
Registered Monitor Dump:
Thread queue lock: <unowned> Name and type hash table lock: <unowned> String intern lock: <unowned> JNI pinning lock: <unowned> JNI global reference lock: <unowned> BinClass lock: <unowned> Class loading lock: <unowned> Java stack lock: <unowned> Code rewrite lock: <unowned> Heap lock: <unowned> Has finalization queue lock: <unowned> Finalize me queue lock: <unowned> Waiting to be notified: "Finalizer thread" (0x815c180) Monitor registry: <unowned (mutex held)>
It's obvious to me, even with what little I know to date about gdb, that the backtrace I'm sending you lacks a symbol table. I did the command a second time, as "bt full", and the only difference was that each line of output was followed by "No symbol table info available."
I'm assuming that you probably need symbol table information in order to make sense of any of this output?
Anyway, please let me know if there's something I need to do differently, as I'm definitely a novice, at best, with respect to gdb.
Here's the output:
bash-2.04# gdb program 5335 GNU gdb 4.18 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-suse-linux"... Attaching to Pid 5335 0x40074b7e in ?? () (gdb) bt #0 0x40074b7e in ?? () #1 0x4002e9e3 in ?? () #2 0x80d2456 in ?? () #3 0x808eede in ?? () #4 0x8071c62 in ?? () #5 0x806ed8f in ?? () #6 0x4006ea8e in ?? () (gdb)
thread apply all bt
This should print the backtrace for all of the threads.
Here's the dump (finally):
bash-2.04# !! gdb bin/nsd GNU gdb 4.18 Copyright 1998 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-suse-linux"... (gdb) set args -fkt nsd.tcl -u nsadmin -g nsadmin (gdb) run Starting program: /usr/local/aolserver/bin/nsd -fkt nsd.tcl -u nsadmin -g nsadmin [14/Feb/2001:23:18:24][8811.1024][-main-] Notice: nsd.tcl: starting to read config file... ... [14/Feb/2001:23:21:56][8850.1024][-main-] Notice: ModuleInit: Java Module ENABLED [New Thread 8855] [Switching to Thread 8855] [New Thread 8856] ... [14/Feb/2001:23:21:57][8850.1024][-main-] Notice: ModuleInit: JVM init succeeded! [14/Feb/2001:23:22:15][8850.6151][-conn0-] Notice: Ns_PgOpenDb(postgres): Open ned connection to localhost::ruchirasala. [14/Feb/2001:23:22:15][8850.6151][-conn0-] Notice: Querying ' select user_id, token, secure_token, last_ip, last_hit from sec_sessions where session_id = 361;' [14/Feb/2001:23:22:15][8850.6151][-conn0-] Notice: dbinit: sql(localhost::ruchi rasala): ' select user_id, token, secure_token, last_ip, last_hit from sec_sessions where session_id = 361 ' [Switching to Thread 8865] Program received signal SIGSEGV, Segmentation fault. 0x4027aca6 in sysThreadStackBase () at ../../../../src/linux/java/native_threads/src/threads_md.c:8787 ../../../../src/linux/java/native_threads/src/threads_md.c: No such file or directory. (gdb) (gdb) thread apply all bt Thread 9 (Thread 8867): #0 0x400f171e in select () from /lib/libc.so.6 #1 0x80ed330 in __DTOR_END__ () #2 0x80d094a in NsThreadMain (arg=0x86dd448) at thread.c:241 #3 0x4002bf93 in pthread_start_thread (arg=0xbebffe40) at manager.c:241 Thread 8 (Thread 8865): #0 0x4027aca6 in sysThreadStackBase () at ../../../../src/linux/java/native_threads/src/threads_md.c:87 #1 0x40266a99 in invoke_FindClass (env=0x402909d4, name=0x86aada8 "MessageComposer") at ../../../../src/share/java/runtime/jni.c:2855 #2 0x401a6fed in NsJava_JavaEvalCmd () from /usr/local/aolserver/bin/libnsjava.so #3 0x8093945 in Tcl_review (interp=0x84f9e18, cmd=0x86abdd8 " set tmpfile [ns_mktemp "[ns_info pageroot]/webmail/tmp/.wm_msgXXXXXX"] # nsjava available at http://nsjava.sourceforge.net ns_java MessageComposer::compose_message $outgoing_msg_id $tmp"...) at ./../generic/tclBasic.c:1397 #4 0x80c26f1 in Tcl_UplevelCmd (dummy=0x0, interp=0x84f9e18, argc=1, argv=0xbedfe7e0) at ./../generic/tclProc.c:302 #5 0x8093945 in Tcl_review (interp=0x84f9e18, cmd=0xbedfea12 "ns_db dml $db "begin transaction" ", ' ' , "uplevel $body ", ' ' , "ns_db dml $db "end transaction"") at ./../generic/tclBasic.c:1397 #6 0x8094c9a in Tcl_CatchCmd (dummy=0x0, interp=0x84f9e18, argc=3, argv=0xbedfe9cc) at ./../generic/tclCmdAH.c:233 #7 0x8093945 in Tcl_review (interp=0x84f9e18, cmd=0x85eb148 "catch {ns_db dml $db "begin transaction" ", ' ' , "uplevel $body ", ' ' , "ns_db dml $db "end transaction"} errmsg] { ns_log Notice "error: $errmsg" ns_db dml $db "abort transaction"...) at ./../generic/tclBasic.c:1397 #8 0x80be0dc in TclParseNestedCmd (interp=0x84f9e18, string=0x85eb148 "catch {ns_db dml $db "begin transaction" ", ' ' , "uplevel $body ", ' ' , "ns_db dml $db "end transaction"} errmsg] { ns_log Notice "error: $errmsg" ns_db dml $db "abort transaction"..., flags=0, termPtr=0xbedfec38, pvPtr=0xbedfec88) at ./../generic/tclParse.c:428 #9 0x80be595 in TclParseWords (interp=0x84f9e18, string=0x85eb144 "if [catch {ns_db dml $db "begin transaction" ", ' ' , "uplevel $body ", ' ' , "ns_db dml $db "end transaction"} errmsg] { ns_log Notice "error: $errmsg" ns_db dml $db "abort transac"..., flags=0, maxWords=8, termPtr=0xbedfec38, argcPtr=0xbedfec28, argv=0xbedfec5c, pvPtr=0xbedfec88) at ./../generic/tclParse.c:705 #10 0x8093449 in Tcl_review (interp=0x84f9e18, cmd=0x85eb108 " upvar errmsg errmsg global errorInfo errorCode if [catch {ns_db dml $db "begin transaction" ", ' ' , "uplevel $body ", ' ' , "ns_db dml $db "end transaction"} errmsg] { ns_log "...) at ./../generic/tclBasic.c:1284 #11 0x80c2a74 in InterpProc (clientData=0x85eb080, interp=0x84f9e18, argc=0, argv=0xbedfef0c) at ./../generic/tclProc.c:494 #12 0x8093945 in Tcl_review (interp=0x84f9e18, cmd=0x86a8d10 "# /webmail/message-send-3.tcl # by jsc@arsdigita.com (2000-03-01) # Send the email. ad_page_variables {{response_to_msg_id ""} outgoing_msg_id} set user_id [ad_verify_and_get_user_id] set db [ns_d"...) at ./../generic/tclBasic.c:1397 #13 0x80ba5b0 in Tcl_EvalFile (interp=0x84f9e18, fileName=0xbedff373 "/web/ruchirasala/www/webmail/message-send-3.tcl") at ./../generic/tclIOUtil.c:415 #14 0x809ca65 in Tcl_SourceCmd (dummy=0x0, interp=0x84f9e18, argc=2, argv=0xbedff32c) at ./../generic/tclCmdMZ.c:1009 #15 0x8093945 in Tcl_review (interp=0x84f9e18, cmd=0xbedff584 " source $script ") at ./../generic/tclBasic.c:1397 #16 0x8097d9d in Tcl_IfCmd (dummy=0x0, interp=0x84f9e18, argc=5, argv=0xbedff51c) at ./../generic/tclCmdIL.c:167 #17 0x8093945 in Tcl_review (interp=0x84f9e18, cmd=0x86400d0 " set script [ns_url2file [ns_conn url $conn]] if ![file exists $script] { ns_returnnotfound $conn } else { source $script } ") at ./../generic/tclBasic.c:1397 #18 0x80c2a74 in InterpProc (clientData=0x8640038, interp=0x84f9e18, argc=0, argv=0xbedff7cc) at ./../generic/tclProc.c:494 #19 0x8093945 in Tcl_review (interp=0x84f9e18, cmd=0xbedff940 "ns_sourceproc cns2 {}") at ./../generic/tclBasic.c:1397 #20 0x8093ed9 in Tcl_Globalreview (interp=0x84f9e18, command=0xbedff940 "ns_sourceproc cns2 {}") at ./../generic/tclBasic.c:1746 #21 0x80844e9 in TclDoOp (arg=0x81c07c0, conn=0x8389518) at tclop.c:590 #22 0x8072765 in Ns_ConnRunRequest (conn=0x8389518) at op.c:196 #23 0x80791ae in ConnRun (connPtr=0x8389518) at serv.c:810 #24 0x8078ade in NsConnThread (arg=0x84ff100) at serv.c:609 #25 0x80d094a in NsThreadMain (arg=0x8538028) at thread.c:241 #26 0x4002bf93 in pthread_start_thread (arg=0xbedffe40) at manager.c:241 Thread 7 (Thread 8858): #0 0x400f171e in select () from /lib/libc.so.6 #1 0x4001f8d8 in Ns_ModuleVersion () from /usr/local/aolserver/bin/nssock.so #2 0x80d094a in NsThreadMain (arg=0x8366aa0) at thread.c:241 #3 0x4002bf93 in pthread_start_thread (arg=0xbefffe40) at manager.c:241 Thread 6 (Thread 8857): #0 0x40074b7e in sigsuspend () at ../sysdeps/unix/sysv/linux/sigsuspend.c:59 #1 0x4002e2d0 in __pthread_wait_for_restart_signal (self=0xbf1ffe40) at pthread.c:793 #2 0x4002f474 in __new_sem_wait (sem=0x40292130) at restart.h:26 #3 0x4027bf51 in sqh () at ../../../../src/linux/java/native_threads/src/interrupt_md.c:232 #4 0x4027ad8c in jdk_start (tid_=0x815b208) at ../../../../src/linux/java/native_threads/src/threads_md.c:446 #5 0x4002bf93 in pthread_start_thread (arg=0xbf1ffe40) at manager.c:241 Thread 5 (Thread 8856): #0 0x40074b7e in sigsuspend () at ../sysdeps/unix/sysv/linux/sigsuspend.c:59 #1 0x4002e2d0 in __pthread_wait_for_restart_signal (self=0xbf3ffe40) at pthread.c:793 #2 0x4002ad40 in pthread_cond_wait () at condvar.c:72 #3 0x4027ba0b in condvarWait () at ../../../../src/linux/java/native_threads/src/condvar_md.c:194 #4 0x4027a6fb in sysMonitorWait () at ../../../../src/linux/java/native_threads/src/monitor_md.c:127 #5 0x4025bfc4 in finalizer_loop (tid=0x40653088) at ../../../../src/share/java/runtime/finalize.c:276 #6 0x4027ad8c in jdk_start (tid_=0x815b0c8) at ../../../../src/linux/java/native_threads/src/threads_md.c:446 #7 0x4002bf93 in pthread_start_thread (arg=0xbf3ffe40) at manager.c:241 Thread 4 (Thread 8855): #0 0x400d7391 in nanosleep () from /lib/libc.so.6 #1 0x400d731b in __sleep (seconds=1) at ../sysdeps/unix/sysv/linux/sleep.c:82 #2 0x4019ffbc in NsJava_StartJvm () from /usr/local/aolserver/bin/libnsjava.so #3 0x80d094a in NsThreadMain (arg=0x81118f0) at thread.c:241 #4 0x4002bf93 in pthread_start_thread (arg=0xbf5ffe40) at manager.c:241 Thread 3 (Thread 8854): #0 0x400d7391 in nanosleep () from /lib/libc.so.6 #1 0x4002b3e6 in pthread_cond_timedwait_relative_new (cond=0x80f9658, mutex=0x80fe2b0, abstime=0xbf7ffcec) at condvar.c:318 #2 0x4002b53a in pthread_cond_timedwait () at condvar.c:375 #3 0x80d35fb in Ns_CondTimedWait (condPtr=0x80ee358, mutexPtr=0x80ee354, timePtr=0xbf7ffd30) at pthread.cpp:525 #4 0x80779cf in SchedThread (ignored=0x0) at sched.c:789 #5 0x80d094a in NsThreadMain (arg=0x80ff290) at thread.c:241 #6 0x4002bf93 in pthread_start_thread (arg=0xbf7ffe40) at manager.c:241 Thread 2 (Thread 8850 (initial thread)): #0 0x40074b7e in sigsuspend () at ../sysdeps/unix/sysv/linux/sigsuspend.c:59 #1 0x4002e9e3 in sigwait () at signals.c:169 #2 0x80d2456 in ns_sigwait (set=0xbfffe2cc, sig=0xbfffe2c4) at signal.c:87 #3 0x808eede in NsHandleSignals () at unix.c:158 #4 0x8071c62 in Ns_Main (argc=7, argv=0xbffff654, initProc=0x806eda0 ) at nsmain.c:667 #5 0x806ed8f in main (argc=7, argv=0xbffff654) at main.c:64 Thread 1 (Thread 8853 (manager thread)): #0 0x400effdd in poll () at ../sysdeps/unix/sysv/linux/poll.c:55 #1 0x4002bc9a in __pthread_manager (arg=0x9) at manager.c:128 0x4027aca6 87 in ../../../../src/linux/java/native_threads/src/threads_md.c (gdb)
I'm also going to try your suggestion of converting to _v3. Possibly tonight, if I have time.
/web/{server}/www/webmail/java
(where "{server}" is of course the literal name of my server). I'm also fairly certain the classes have been compiled. I'm not entirely certain that the classes were last compiled with the appropriate JDK in the CLASSPATH, since I've been moving around from JDK to JDK in an attempt to find something that works. So, I'll check that tonight, and/or just try recompiling everything with Blackdown v3 JDK. (Obviously, I'll also doublecheck ClassPath, in nsd.tcl.)
Again, thanks much for your assistance, Dan.
Dan, can you point me to a webmail "HowTo" for beginners, because all the threads are a little bit discouraging to get webmail working?
Thanks
I never did get Webmail working under either SuSE 7.0 or RedHat 7.0! Finally I ended up throwing up my hands in frustration and I've been spending a bit of time the last few weeks "retrofitting" all of my existing Open ACS installations (spread over two desktops and one laptop) with RedHat 6.2, which has finally given me a glimpse of the light at the end of the tunnel.
There are obviously problems with some of the newer versions of the shared libraries, when it comes to compiling nsjava (and also getting it to work!) on versions of Linux beyond whatever version of the kernel RedHat 6.2 employs. As has been suggested in this forum, the problems are mostly related to pthreads, I believe.
I wish I knew enough about this area in order to be able to be of service in getting nsjava to work on post-RedHat 6.2 OS's, but I don't, and it just comes down to having more important things that I have to accomplish in my various Open ACS-related projects. Webmail is a very nice-to-have feature in this community system -- perhaps it's even crucial to be able to offer it in any online community system worth its salt -- but when all is said and done, if it works under RedHat 6.2 (and it does) then I'll do what's required to reinstall the OS so that I can get to more interesting parts of my projects. (Not to say that it's not interesting -- or not useful -- to get Webmail working under many different configurations ... but it's just not my area of expertise, and I can only beat my head against that wall for so long before I choose a proven method for getting the job done.)
Anyway, I've got one laptop and one desktop done, and just one desktop left to go, so I'm nearly done with this phase of the adventure.
Suffice it to say, for anyone who's considering making use of Webmail, it does work on RedHat 6.2, and probably works under a few other configurations. If you need to use Webmail under Linux, you'll probably save yourself much frustration if you simply install RedHat 6.2 from the getgo.
It's true that there are problems with pthreads libraries and nsjava, but it is really just a symptom of a bigger problem with running pre-compiled programs on linux. It seems that vendors such as sun, idm, and blackdown compile their jdk's against one distrubution and distribute it as a "linux jdk". I haven't been able to verify if it's true or not, but I believe they compile their jdk's using redhat, so in general (except for sun) their jdk's work well on redhat machines, but otherwise, there are problems with library compatiblity like pthreads when trying to use the jdk's on other linux distros. The debacle that is redhat 7.0 has aggravated this problem because they released 7.0 using a non-released version of gcc. As a result, libraries compiled for redhat 7.0 are not compatible with other distros that use standard released versions of gcc for compilation.
I've found the whole situation fustrating, and I understand, despite claims to the contrary, why java has not become popular on linux. As long as java remains closed-source, the situation probably will not change. Sun seems determined to maintain tight control over java until .net supercedes it, and it fades into obscurity.