Can someone help me understand what is going on here please?

968 views
Skip to first unread message

Andrew

unread,
Sep 9, 2009, 6:50:18 PM9/9/09
to javaloader-dev
Hi,

I found the link to this group from javaloader.riaforge.org and I hope
it's okay to ask "user" type questions on this dev list?

I'm at my wits end trying to get a java class running which a
colleague wrote. The class generates a jasper report. It runs
without any problems standalone, but as soon as I try and call it from
CF I am running into problems.

My development environment is CF8 (Multiserver with JRun) on Windows
Vista. I have tried with both Javaloader 0.6 and 1.0alpha, and both
give the same error.

Here is what I am trying to do. My test page is shown below:

=====
<cfset jarPath = ExpandPath(".") & "/lib">
<cfset aJars = ArrayNew(1)>
<cfset jarList = "">
<cfset separator = createObject("java","java.io.File").separator>

<cfdirectory action="list" name="qJars" directory="#jarPath#"
filter="*.jar" sort="name asc"/>

<cfloop query="qJars">
<cfscript>
ArrayAppend(aJars, directory & separator & name);
</cfscript>
</cfloop>

<cfset loader = createObject("component", "javaloader.JavaLoader").init
(aJars,false)>

<cfscript>
reportTest = loader.create('org.xyz.Main').init();
reportTest.doStuff();
</cfscript>

<p>Done</p>

======

The "lib" subdir contains the following 9 jars. These are enough to
get it running from a command line:

commons-collections-2.1.jar
commons-digester-1.7.jar
commons-logging-1.0.2.jar
itext-2.1.0.jar
jasperreports-3.5.3.jar
log4j-1.2.14.jar
ojdbc5-11.1.0.7.0.jar
printable-reports.jar (this is our code)
reports-test.jar (also our code)

However when I call it from the CF page above I get this error:

ROOT CAUSE:
java.lang.ExceptionInInitializerError
at sun.misc.Unsafe.ensureClassInitialized(Native Method)
at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor
(UnsafeFieldAccessorFactory.java:25)
at sun.reflect.ReflectionFactory.newFieldAccessor
(ReflectionFactory.java:122)
at java.lang.reflect.Field.acquireFieldAccessor(Field.java:918)
at java.lang.reflect.Field.getFieldAccessor(Field.java:899)
at java.lang.reflect.Field.getLong(Field.java:528)
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:
1614)
at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:52)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:425)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:413)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:310)
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:547)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:
1583)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:
1496)
at java.io.ObjectInputStream.readOrdinaryObject
(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:
1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:
1871)
at java.io.ObjectInputStream.readOrdinaryObject
(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:
1947)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:
1871)
at java.io.ObjectInputStream.readOrdinaryObject
(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:
1947)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:
480)
at net.sf.jasperreports.engine.base.JRBaseReport.readObject
(JRBaseReport.java:736)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:
974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:
1849)
at java.io.ObjectInputStream.readOrdinaryObject
(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:
94)
at net.sf.jasperreports.engine.JasperFillManager.fillReport
(JasperFillManager.java:247)
at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfFile
(JasperRunManager.java:126)
at org.xyz.printablereports.ReportServiceImpl.createPDF
(ReportServiceImpl.java:85)
at org.xyz.Main.doStuff(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at coldfusion.runtime.StructBean.invoke(StructBean.java:511)
at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2300)
at cfjasper2dtest2dwith2djava2dloader2ecfm870391076.runPage(C:\www
\national-website\html\root\testapp\jasper-test-with-java-loader.cfm:
31)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:
273)
at coldfusion.filter.RequestMonitorFilter.invoke
(RequestMonitorFilter.java:48)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:
40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:27)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.BrowserDebugFilter.invoke
(BrowserDebugFilter.java:74)
at coldfusion.filter.ClientScopePersistenceFilter.invoke
(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:
22)
at coldfusion.CfmServlet.service(CfmServlet.java:175)
at coldfusion.bootstrap.BootstrapServlet.service
(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter
(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:
46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke
(JRunRequestDispatcher.java:286)
at jrun.servlet.ServletEngineService.dispatch
(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable
(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable
(ThreadPool.java:428)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Caused by: org.apache.commons.logging.LogConfigurationException:
java.lang.ClassCastException:
org.apache.commons.logging.impl.LogFactoryImpl cannot be cast to
org.apache.commons.logging.LogFactory
at org.apache.commons.logging.LogFactory.newFactory(LogFactory.java:
558)
at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:
345)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:390)
at net.sf.jasperreports.engine.JRPropertiesMap.<clinit>
(JRPropertiesMap.java:59)
... 80 more
Caused by: java.lang.ClassCastException:
org.apache.commons.logging.impl.LogFactoryImpl cannot be cast to
org.apache.commons.logging.LogFactory
at org.apache.commons.logging.LogFactory.newFactory(LogFactory.java:
554)
... 83 more

I can get past this error (but get another one - see further down) by
replacing commons-logging-1.0.2.jar with commons-logging-1.1.jar but
that just doesn't make sense to me because commons-logging-1.0.2.jar
works when I run it outside of CF. It seems to still be picking up
stuff from somewhere else, but I can't understand where or how?

Anyway after removing commons-logging-1.0.2.jar and putting in commons-
logging-1.1.jar, the next error I see is another ClassCastException:

org.xyz.printablereports.ReportException: Error creating PDF File
at org.xyz.printablereports.ReportServiceImpl.createPDF
(ReportServiceImpl.java:87)
at org.xyz.Main.doStuff(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at coldfusion.runtime.StructBean.invoke(StructBean.java:511)
at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2300)
at cfjasper2dtest2dwith2djava2dloader2ecfm870391076.runPage(C:\www
\national-website\html\root\testapp\jasper-test-with-java-loader.cfm:
29)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:
273)
at coldfusion.filter.RequestMonitorFilter.invoke
(RequestMonitorFilter.java:48)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:
40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:27)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.BrowserDebugFilter.invoke
(BrowserDebugFilter.java:74)
at coldfusion.filter.ClientScopePersistenceFilter.invoke
(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:
22)
at coldfusion.CfmServlet.service(CfmServlet.java:175)
at coldfusion.bootstrap.BootstrapServlet.service
(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter
(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:
46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke
(JRunRequestDispatcher.java:286)
at jrun.servlet.ServletEngineService.dispatch
(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable
(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable
(ThreadPool.java:428)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Caused by: net.sf.jasperreports.engine.JRException: Could not
instantiate report compiler :
net.sf.jasperreports.engine.design.JRJavacCompiler
at net.sf.jasperreports.engine.JasperCompileManager.getCompiler
(JasperCompileManager.java:480)
at net.sf.jasperreports.engine.JasperCompileManager.loadEvaluator
(JasperCompileManager.java:242)
at net.sf.jasperreports.engine.fill.JRFillDataset.createCalculator
(JRFillDataset.java:420)
at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>
(JRBaseFiller.java:411)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>
(JRVerticalFiller.java:78)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>
(JRVerticalFiller.java:60)
at net.sf.jasperreports.engine.fill.JRFiller.createFiller
(JRFiller.java:147)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:
57)
at net.sf.jasperreports.engine.JasperFillManager.fillReport
(JasperFillManager.java:421)
at net.sf.jasperreports.engine.JasperFillManager.fillReport
(JasperFillManager.java:251)
at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfFile
(JasperRunManager.java:126)
at org.xyz.printablereports.ReportServiceImpl.createPDF
(ReportServiceImpl.java:85)
... 37 more
Caused by: java.lang.ClassCastException:
net.sf.jasperreports.engine.design.JRJavacCompiler cannot be cast to
net.sf.jasperreports.engine.design.JRCompiler
at net.sf.jasperreports.engine.JasperCompileManager.getCompiler
(JasperCompileManager.java:476)
... 48 more

Again, I can run this fine from a command line with just those exact 9
jars and nothing else on the classpath, so I cannot understand what is
happening. Does anyone have any ideas what might be going on? I'm
completely stumped.

Andrew.

P.S. My first attempt at this before trying out Javaloader was
putting these jars in the WEB-INF/lib of my coldfusion install. I was
receiving the error:

java.lang.ClassCastException:
net.sf.jasperreports.engine.design.JRJavacCompiler cannot be cast to
net.sf.jasperreports.engine.design.JRCompiler

That's when I decided to try javaloader as I thought this would give
me a classloader without any of the internal cf stuff on the classpath
(is this correct?).

I have been able to run the same code fine on Railo putting these jars
in it's WEB-INF/lib also - but have not tried there with Javaloader.

Mark Mandel

unread,
Sep 9, 2009, 8:20:22 PM9/9/09
to javaloa...@googlegroups.com
On Thu, Sep 10, 2009 at 8:50 AM, Andrew <am2...@gmail.com> wrote:
>
> Hi,
>
> I found the link to this group from javaloader.riaforge.org and I hope
> it's okay to ask "user" type questions on this dev list?

This is exactly what this list is for, so ask away.

It sounds like you are running into some Classpath issues, which can
be a real pain to sort out. Let's see what we can suggest.

Log4j can be notorious for this, because it will store stuff in the
system classpath, and JavaLoader accesses that as well (it has to for
core Java classes), and CF starts up with it. Later version of log4j
handle this a bit nicer however.

Let's focus on the latest version of commons-logging, and see what is
going on there:

Looking at the stack trace, at line:
(ReportServiceImpl.java:87)

What is happening in the source code?

We can also see:


> Caused by: net.sf.jasperreports.engine.JRException: Could not
> instantiate report compiler :
> net.sf.jasperreports.engine.design.JRJavacCompiler
> at net.sf.jasperreports.engine.JasperCompileManager.getCompiler
> (JasperCompileManager.java:480)

> Caused by: java.lang.ClassCastException:


> net.sf.jasperreports.engine.design.JRJavacCompiler cannot be cast to
> net.sf.jasperreports.engine.design.JRCompiler
> at net.sf.jasperreports.engine.JasperCompileManager.getCompiler
> (JasperCompileManager.java:476)

Doing a google search on this seems to mean that some other people are
running into the same issue, and it seems to be classpath related as
well.

Do me a favour, try it without the itext.jar, and see what happens. It
*shouldn't* work, but maybe it will.

Mark

--
E: mark....@gmail.com
T: http://www.twitter.com/neurotic
W: www.compoundtheory.com

Andrew Myers

unread,
Sep 10, 2009, 12:10:21 AM9/10/09
to javaloa...@googlegroups.com
Hi Mark,

Thanks for getting back to me. 

That line in the Java code is calling:

JasperRunManager.runReportToPdfStream(input, out, params, conn);

JasperRunManager being net.sf.jasperreports.engine.JasperRunManager

I've tried without the itext-2.1.0.jar in my lib directory, and it gives

org.xyz.printablereports.ReportException: Error creating PDF File
    at org.xyz.printablereports.ReportServiceImpl.createPDF(ReportServiceImpl.java:163)

    at org.xyz.Main.doStuff(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

    at java.lang.reflect.Method.invoke(Method.java:597)
    at coldfusion.runtime.StructBean.invoke(StructBean.java:511)
    at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2300)
    at cfjasper2dtest2dwith2djava2dloader2ecfm870391076.runPage(C:\www\national-website\html\root\testapp\jasper-test-with-java-loader.cfm:29)
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196)
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370)
    at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
    at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:273)
    at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)

    at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
    at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
    at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:27)
    at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
    at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:74)
    at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)

    at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
    at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
    at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
    at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
    at coldfusion.CfmServlet.service(CfmServlet.java:175)
    at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)

    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
    at jrun.servlet.FilterChain.service(FilterChain.java:101)
    at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
    at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
    at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
    at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)

    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Caused by: net.sf.jasperreports.engine.JRException: Could not instantiate report compiler : net.sf.jasperreports.engine.design.JRJavacCompiler
    at net.sf.jasperreports.engine.JasperCompileManager.getCompiler(JasperCompileManager.java:480)
    at net.sf.jasperreports.engine.JasperCompileManager.loadEvaluator(JasperCompileManager.java:242)
    at net.sf.jasperreports.engine.fill.JRFillDataset.createCalculator(JRFillDataset.java:420)

    at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:411)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:78)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:60)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:147)

    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:57)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:421)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:382)
    at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:167)
    at org.xyz.printablereports.ReportServiceImpl.createPDF(ReportServiceImpl.java:160)

    ... 37 more
Caused by: java.lang.ClassCastException: net.sf.jasperreports.engine.design.JRJavacCompiler cannot be cast to net.sf.jasperreports.engine.design.JRCompiler
    at net.sf.jasperreports.engine.JasperCompileManager.getCompiler(JasperCompileManager.java:476)
    ... 48 more

To me this is kind of interesting, because we are still getting a ClassCastException?

Note the line numbers have changed here because I updated the Java code in an effort to try and work out what was happening.

Also - is there any way to lock down the classloader so there's absolutely nothing else in the classpath except what is in that lib directory?  I was hoping this was what would happen with Javaloader, and indeed if I debug like this, I get this output:


<cfset jarPath = ExpandPath(".") & "/lib">
<cfset aJars = ArrayNew(1)>
<cfset jarList = "">
<cfset separator = createObject("java","java.io.File").separator>

<cfdirectory action="list" name="qJars" directory="#jarPath#" filter="*.jar" sort="name asc"/>

    <cfloop query="qJars">
        <cfscript>
        ArrayAppend(aJars, directory & separator & name);
        </cfscript>
    </cfloop>

  <cfdump var="#aJars#">

 

<cfset loader = createObject("component", "javaloader.JavaLoader").init(aJars,false)>
<cfset urls = loader.getURLClassLoader().getURLs()>

<cfloop from="1" to="#ArrayLen(urls)#" index="i">
  <cfoutput>#urls[i].toString()#</cfoutput>
</cfloop>



array
1 C:\www\national-website\html\root\testapp\lib\commons-collections-2.1.jar
2 C:\www\national-website\html\root\testapp\lib\commons-digester-1.7.jar
3 C:\www\national-website\html\root\testapp\lib\commons-logging-1.1.jar
4 C:\www\national-website\html\root\testapp\lib\jasperreports-3.5.3.jar
5 C:\www\national-website\html\root\testapp\lib\log4j-1.2.14.jar
6 C:\www\national-website\html\root\testapp\lib\ojdbc5-11.1.0.7.0.jar
7 C:\www\national-website\html\root\testapp\lib\printable-reports.jar
8 C:\www\national-website\html\root\testapp\lib\reports-test.jar

file:/C:/www/national-website/html/root/testapp/lib/ojdbc5-11.1.0.7.0.jar file:/C:/www/national-website/html/root/testapp/lib/reports-test.jar file:/C:/www/national-website/html/root/testapp/lib/commons-digester-1.7.jar file:/C:/www/national-website/html/root/testapp/lib/commons-collections-2.1.jar file:/C:/www/national-website/html/root/testapp/lib/commons-logging-1.1.jar file:/C:/www/national-website/html/root/testapp/lib/log4j-1.2.14.jar file:/C:/www/national-website/html/root/testapp/lib/printable-reports.jar file:/C:/www/national-website/html/root/testapp/lib/jasperreports-3.5.3.jar

So how could anything else be getting involved?  I don't get it :-)

2009/9/10 Mark Mandel <mark....@gmail.com>

Mark Mandel

unread,
Sep 10, 2009, 12:55:03 AM9/10/09
to javaloa...@googlegroups.com
On Thu, Sep 10, 2009 at 2:10 PM, Andrew Myers <am2...@gmail.com> wrote:
Hi Mark,

Thanks for getting back to me. 

That line in the Java code is calling:

JasperRunManager.runReportToPdfStream(input, out, params, conn);

JasperRunManager being net.sf.jasperreports.engine.JasperRunManager

I've tried without the itext-2.1.0.jar in my lib directory, and it gives

org.xyz.printablereports.ReportException: Error creating PDF File
    at org.xyz.printablereports.ReportServiceImpl.createPDF(ReportServiceImpl.java:163)
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Caused by: net.sf.jasperreports.engine.JRException: Could not instantiate report compiler : net.sf.jasperreports.engine.design.JRJavacCompiler
    at net.sf.jasperreports.engine.JasperCompileManager.getCompiler(JasperCompileManager.java:480)
    at net.sf.jasperreports.engine.JasperCompileManager.loadEvaluator(JasperCompileManager.java:242)
    at net.sf.jasperreports.engine.fill.JRFillDataset.createCalculator(JRFillDataset.java:420)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:411)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:78)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:60)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:147)
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:57)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:421)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:382)
    at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:167)
    at org.xyz.printablereports.ReportServiceImpl.createPDF(ReportServiceImpl.java:160)

    ... 37 more
Caused by: java.lang.ClassCastException: net.sf.jasperreports.engine.design.JRJavacCompiler cannot be cast to net.sf.jasperreports.engine.design.JRCompiler
    at net.sf.jasperreports.engine.JasperCompileManager.getCompiler(JasperCompileManager.java:476)
    ... 48 more

To me this is kind of interesting, because we are still getting a ClassCastException?

Note the line numbers have changed here because I updated the Java code in an effort to try and work out what was happening.

Also - is there any way to lock down the classloader so there's absolutely nothing else in the classpath except what is in that lib directory?  I was hoping this was what would happen with Javaloader, and indeed if I debug like this, I get this output:

Welcome to the wonderful voodoo that can be ClassLoaders. Part Black Magic, but Good Fun. All is not as it seems.

In theory, you are correct, it looks good. But something weird is going on.

What is weird, is that its acting like there is more than 1 JasperReports on the classpath, and... from my installation at least, there is no jar named 'jasperreports' in my ColdFusion/lib folder...

Is there one in yours? Or in any of the other /lib folders under ColdFusion root?

Mark

Andrew Myers

unread,
Sep 10, 2009, 1:21:19 AM9/10/09
to javaloa...@googlegroups.com
Hmm I've found a potential candidate.

C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\WEB-INF\cfusion\lib\cfusion.jar

This contains:

\net\sf\jasperreports\engine

JRWrappingSvgRenderer.class
JRVirtualizer.class
JRVirtualizationHelper.class
JRVirtualizable.class
JRVariable.class
JRValueParameter.class
JRTextField.class
JRTextElement.class
JRSubreportReturnValue.class
JRSubreportParameter.class
JRSubreport.class
JRStyleContainer.class
JRStyle.class
JRStaticText.class
JRScriptletException.class
JRRuntimeException.class
JRRewindableDataSource.class
JRResultSetDataSource.class
JRReportFont.class
JRReport.class
JRRenderable.class
JRRectangle.class
JRQueryChunk.class
JRQuery.class
JRPropertiesMap.class
JRPrintText.class
JRPrintRectangle.class
JRPrintPage.class
JRPrintLine.class
JRPrintImageAreaHyperlink.class
JRPrintImageArea.class
JRPrintImage.class
JRPrintHyperlinkParameters.class
JRPrintHyperlinkParameter.class
JRPrintHyperlink.class
JRPrintGraphicElement.class
JRPrintFrame.class
JRPrintEllipse.class
JRPrintElementIndex.class
JRPrintElementContainer.class
JRPrintElement.class
JRPrintBreak.class
JRPrintAnchorIndex.class
JRPrintAnchor.class
JRParameter.class
JRLine.class
JRImageRenderer.class
JRImageMapRenderer.class
JRImage.class
JRHyperlinkParameter.class
JRHyperlinkHelper.class
JRHyperlink.class
JRGroup.class
JRGraphicElement.class
JRFrame.class
JRFont.class
JRField.class
JRExpressionCollector.class
JRExpressionCollector$GeneratedIds.class
JRExpressionChunk.class
JRExpression.class
JRExporterParameter.class
JRExporter.class
JRException.class
JREmptyDataSource.class
JREllipse.class
JRElementGroup.class
JRElementDataset.class
JRElement.class
JRDefaultStyleProvider.class
JRDefaultScriptlet.class
JRDefaultFontProvider.class
JRDataSourceProvider.class
JRDataSource.class
JRDatasetRun.class
JRDatasetParameter.class
JRDataset.class
JRConstants.class
JRConditionalStyle.class
JRChild.class
JRBreak.class
JRBox.class
JRBand.class
JRAnchor.class
JRAlignment.class
JRAbstractSvgRenderer.class
JRAbstractScriptlet.class
JRAbstractRenderer.class
JRAbstractObjectFactory.class
JRAbstractExporter.class
JasperRunManager.class
JasperReport.class
JasperPrintManager.class
JasperPrint.class
JasperPrint$DefaultStyleProvider.class
JasperManager.class
JasperFillManager.class
JasperExportManager.class
JasperCompileManager.class
xml
util
query
print
images
fill
export
dtds
design
data
base

Shucks!

2009/9/10 Mark Mandel <mark....@gmail.com>

Mark Mandel

unread,
Sep 10, 2009, 1:23:21 AM9/10/09
to javaloa...@googlegroups.com
Oh Hell... that will get loaded into the system classloader, most likely...

Okay, well try this then - try to run your JasperReports code, but
without your own jasperreports*.jar

See how that goes.

Mark

Mark Mandel

unread,
Sep 10, 2009, 1:25:04 AM9/10/09
to javaloa...@googlegroups.com
What's weird.. is I would have thought not loading the ColdFusion
classpath, that would be ignored... that is very strange..

You definitely haven't set loadColdFusionClasspath to true?

Mark

Andrew Myers

unread,
Sep 10, 2009, 1:47:34 AM9/10/09
to javaloa...@googlegroups.com
Removed the jar, and some progress, but still weird.  This is the error now.

ROOT CAUSE:
java.lang.NoClassDefFoundError: net/sf/jasperreports/engine/JRException
at org.xyz.Main.doStuff(Unknown Source)

There is a JRException.class in
C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\WEB-INF\cfusion\lib\cfusion.jar\net\sf\jasperreports\engine\
so it's still a bit weird.

If my understanding is correct, I have explicitly set
loadColdFusionClasspath to false. This is where I instantiate the
loader:

<cfset loader = createObject("component",
"javaloader.JavaLoader").init(aJars,false)>

I'm wondering if our best option might be to try and determine what
version of jasper reports is in the cfusion.jar, and try and write our
report to use this?

Thanks again for your help as always!

Andrew.

2009/9/10 Mark Mandel <mark....@gmail.com>

Mark Mandel

unread,
Sep 10, 2009, 1:50:07 AM9/10/09
to javaloa...@googlegroups.com
Try setting that to 'true' and then running it.

Make the ColdFusion version run it.

Mark

On Thu, Sep 10, 2009 at 3:47 PM, Andrew Myers <am2...@gmail.com> wrote:
>
> <cfset loader = createObject("component",
> "javaloader.JavaLoader").init(aJars,false)>

--

Andrew Myers

unread,
Sep 10, 2009, 1:58:36 AM9/10/09
to javaloa...@googlegroups.com
It's giving a NPE now, but I reckon that could be that it may be a
different version of Jasper.

I'll do some testing later on using the cfusion.jar rather than the
jasper reports jar and see if I can replicate the behaviour running it
from the command line.

java.lang.NullPointerException
at net.sf.jasperreports.engine.JRPropertiesMap.getProperty(JRPropertiesMap.java:102)
at net.sf.jasperreports.engine.util.JRProperties.getProperty(JRProperties.java:474)
at net.sf.jasperreports.engine.util.JRProperties.getIntegerProperty(JRProperties.java:512)
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:144)
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:108)
at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:669)
at net.sf.jasperreports.engine.fill.JRFillDataset.setDatasource(JRFillDataset.java:613)
at net.sf.jasperreports.engine.fill.JRFillDataset.setParameterValues(JRFillDataset.java:602)
at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:905)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:734)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:692)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:363)
at net.sf.jasperreports.engine.JasperRunManager.runReportToPdfStream(JasperRunManager.java:163)
at org.xyz.printablereports.ReportServiceImpl.createPDF(ReportServiceImpl.java:160)


2009/9/10 Mark Mandel <mark....@gmail.com>:

Mark Mandel

unread,
Sep 10, 2009, 2:03:41 AM9/10/09
to javaloa...@googlegroups.com
The best trick with NPEs - have a look at the source code at that
point in the code, and work out what is causing it.

From there you can normally determine what is missing.

Mark

--

Andrew Myers

unread,
Sep 11, 2009, 12:51:39 AM9/11/09
to javaloa...@googlegroups.com
Hi Mark,

An update. We've got this working today.

My colleague found this thread: http://forums.adobe.com/thread/40084

It suggested renaming the jasper reports jar to start with the letter
"a" so it appears in the classpath first. I also found that I needed
to do the same with the itext jars.

So what I have is this setup:

In C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\WEB-INF\cfusion\lib

a-jasperreports-3.5.3.jar
a-itext-2.1.0.jar

Then the rest of my jars in my "lib" subdirectory.

I load these as follows:

<cfdirectory action="list" name="qJars" directory="#jarPath#"
filter="*.jar" sort="name asc"/>

<cfloop query="qJars">
<cfscript>
ArrayAppend(aJars, directory & separator & name);
</cfscript>
</cfloop>

<cfset loader = createObject("component",
"javaloader.JavaLoader").init(aJars,true)>

And can call the code without trouble.

It's not what I'd call elegant, and I've probably just broken
cfreports, but I am not using that anyway.

Thought I should post this follow-up anyway for completeness in case
anyone else ever needs it.

Andrew.

Mark Mandel

unread,
Sep 11, 2009, 12:55:38 AM9/11/09
to javaloa...@googlegroups.com
Waiiiiit a minute.

What directory where you pointing your Javaloader at to load your .jar files from?

You weren't pointing it at:

C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\WEB-INF\cfusion\lib

Which is your ColdFusion lib directory?

Mark

Andrew Myers

unread,
Sep 11, 2009, 1:01:06 AM9/11/09
to javaloa...@googlegroups.com
No - my cf code was in

c:\www\national-website\html\root\testapp

(c:\www\national-website\html\root\ being my web root).

The jars were in

c:\www\national-website\html\root\testapp\lib

Obviously I'll tidy this up when and if we come to deploy it, but that
was my test setup.

Andrew.

2009/9/11 Mark Mandel <mark....@gmail.com>:

Mark Mandel

unread,
Sep 11, 2009, 1:02:11 AM9/11/09
to javaloa...@googlegroups.com
Ah * phew *

Still very confused why this didn't work the first way...

What happens if you put a-jasperresports.jar in testapp\lib ?

Mark

Andrew Myers

unread,
Sep 11, 2009, 1:38:33 AM9/11/09
to javaloa...@googlegroups.com
It gives the ClassCastException again.

2009/9/11 Mark Mandel <mark....@gmail.com>:

Mark Mandel

unread,
Sep 11, 2009, 1:39:26 AM9/11/09
to javaloa...@googlegroups.com
That is so weird...

Well, I'm glad you've worked around the problem.

Mark
Reply all
Reply to author
Forward
0 new messages