如何确认我的JAR文件已在Coldfusion中加载?我在CF10上.
我目前收到此错误:
Could not find the ColdFusion component or interface org.apache.batik.transcoder.image.PNGTranscoder.
Run Code Online (Sandbox Code Playgroud)
我的网站结构如下:
/root
/root/application.cfc
/root/jar/batik-1.7/
Run Code Online (Sandbox Code Playgroud)
在我的application.cfc中,我有以下代码:
<cfset This.javaSettings = {loadPaths: ["jar/"],loadColdFusionClassPath: true,reloadOnChange: true,watchInterval: 2}>
Run Code Online (Sandbox Code Playgroud)
这是我调用一切的代码:
<cffunction name="getPng" access="public" output="true">
<cfsavecontent variable="out">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="612px" height="792px" viewBox="0 0 612 792" enable-background="new 0 0 612 792" xml:space="preserve">
<path fill="##006838" stroke="##414042" stroke-miterlimit="10" d="M416.413,388.223c0,6.627-5.373,12-12,12H140.317
c-6.627,0-12-5.373-12-12V272.54c0-6.627,5.373-12,12-12h264.096c6.627,0,12,5.373,12,12V388.223z"/>
<text id="HomeScore" transform="matrix(1 0 0 1 358.5391 361.333)" fill="##F1F2F2" font-family="'ArialMT'" font-size="24">3</text>
<text id="Home" transform="matrix(1 0 0 1 155.3018 361.333)" fill="##F1F2F2" font-family="'ArialMT'" font-size="24">TEAM B</text>
<text id="VisitorScore" transform="matrix(1 0 0 1 358.5391 301.8096)" fill="##F1F2F2" font-family="'ArialMT'" font-size="24">2</text>
<text id="Visitor" transform="matrix(1 0 0 1 155.3018 301.8096)" fill="##F1F2F2" font-family="'ArialMT'" font-size="24">TEAM A</text>
</svg>
</cfsavecontent>
<cfreturn out>
</cffunction>
<cffunction name="renderPng" access="public" output="false">
<cfscript>
/*http://cfsearching.blogspot.ca/2008/02/cool-text-effects-with-svg-and-batik.html*/
pngPath = "test.png";
pngFile = expandPath(pngPath);
transcoder = createObject("java", "org.apache.batik.transcoder.image.PNGTranscoder").init();
inputStream = createObject("java", "java.io.StringBufferInputStream").init(getPng());
input = createObject("java", "org.apache.batik.transcoder.TranscoderInput").init(inputStream);
outputStream = createObject("java", "java.io.FileOutputStream").init(ExpandPath(pngFile));
output = createObject("java", "org.apache.batik.transcoder.TranscoderOutput").init(outputStream);
transcoder.transcode(input, output);
outputStream.close();
return pngFile;
</cfscript>
</cffunction>
<cfscript>
// CREATE OBJECT
obj = createObject("component", "#request.cfcPath#.utils");
// CALL THE FUNCTION
png = obj.renderPng();
</cfscript>
Run Code Online (Sandbox Code Playgroud)
更新#1
我正在检查administor并找到了Settings Summary哪个列出了CF Server Java Class Path.我添加了jar文件的位置并重新启动了服务器.即使路径存在于管理员的类路径中,我仍然会得到相同的错误.
更新2
添加了缺少的属性"type"并收到以下错误:
java.lang.NoClassDefFoundError: org/apache/batik/dom/util/DocumentFactory
Line 554: transcoder = createObject("java", "org.apache.batik.transcoder.image.PNGTranscoder").init();
完整堆栈跟踪
java.lang.ClassNotFoundException:org.apache.batik.dom.util.DocumentFactory位于java的java.lang.ClassLoader.loadClass(ClassLoader.java:356)中的coldfusion.bootstrap.BootstrapClassLoader.loadClass(BootstrapClassLoader.java:235).位于java.lang.Class.privateGetDeclaredFields(Class.java:2317)的lang.Class.getDeclaredFields0(Native Method),位于java.lang.Class.getFields的java.lang.Class.privateGetPublicFields(Class.java:2350)中. java:1378)位于coldfusion.runtime.java.ObjectHandler.(coldHandler.java :)的coldfusion.runtime.java.ObjectHandler.Initialize(ObjectHandler.java:35),位于coldfusion.runtime.java.ReflectionCache.get(ReflectionCache. java:38)at coldfusion.runtime.java.JavaProxy.(JavaProxy.java:35)at coldfusion.runtime.java.JavaProxyFactory.getProxy(JavaProxyFactory.java:117)at coldfusion.runtime.ProxyFactory.getProxy(ProxyFactory.java: 65)coldfusion.runtime.CFPage.createObject中的coldfusion.runtime.CFPage.createObjectProxy(CFPage.java:5747)和coldfusion.runtime中的coldfusion.runtime.CFPage.CreateObject(CFPage.java:5710).位于coldfusion.runtime.CFPage.CreateObject(CFPage.java:5619)的coldfusion.runtime.CFPage.CreateObject(CFPage.java:5619)上的CFPage.CreateObject(CFPage.java:5644)at cfutils2ecfc521921384 $ funcRENDERPNG.runFunction(C:\网站\ mgs_bootstrap\basic\cfc\utils.cfc:554)at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472)at coldfusion.filter.SilentFilter.invoke(SilentFilter.java:47)at coldfusion.runtime.UDFMethod $ ArgumentCollectionFilter.invoke(UDFMethod.java:368)在coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55)在coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321)在coldfusion.runtime.UDFMethod.invoke( UDFMethod.java:220)coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:655)at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:444)at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:414) )at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2432)at cfsvgtest2ecfm1573707502.runPage(C:\ websites\mgs_bootstrap\svgte)st.cfm:5)在coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:244)在coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:444)在coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java :2799)位于coldfusion.runtime.UDFMethod $ ArgumentCollectionFilter.invoke(UDFMethod)的coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472)上的cfapplication2ecfc733577694 $ funcONREQUEST.runFunction(C:\ websites\mgs_bootstrap\application.cfc:87) .java:368)coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55),位于coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:220)在coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:655)的coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:444),在coldfusion.runtime的coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:414).在coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:300)的AppEventInvoker.invoke(AppEventInvoker.java:108)在coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:418)在coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)在coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)在coldfusion.filter. PathFilter.invoke(PathFilter.java:112)at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:30)at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94)at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter) .fava:79)at coldfusion.filter.ClrowserFilter.invoke中的coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28),coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)中的coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)at coldfusion.CfmServlet. service(CfmServlet.java:204)在coldfusion.bootstrap.Bo otstrapServlet.service(BootstrapServlet.java:89)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在ColdFusion的.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)在coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)在org.apache.catalina.core.StandardContextValve.invoke( StandardContextValve.java:169)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)atg.apache.catalina .valves.ErrorReportValve.inv og(ErrorReportValve.java:98)org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)atg.apache位于org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java)的org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:203)上的.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:414) :539)在java.util.concurrent的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)的org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:298). ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:722)
更新3
我在application.cfc中有这个
<cfset This.javaSettings = {loadPaths: ["jar/"],loadColdFusionClassPath: false,reloadOnChange: true,watchInterval: 2}>
我打电话onApplicationStart(),仍然得到同样的错误.
此时,我已经删除了ColdFusion类路径中的条目,现在它已回到默认值为空.
我希望它能够使用javaSettings变量加载jar文件,因为我在共享主机上.
更新:
(聊天总结)Batik 1.7 包含两个已与 CF 10 捆绑在一起的 xml 解析库的较新版本。加载这两个版本将导致 ClassCastException
org.apache.xerces.jaxp.SAXParserFactoryImpl 无法转换为 javax.xml.parsers.SAXParserFactory
为了避免该错误,请从目录中删除这两个 xml jar batik-1.7/lib,这样就不会加载它们:
/batik-1.7/lib/xerces_2_5_0.jar
/batik-1.7/lib/xml-apis.jar
Run Code Online (Sandbox Code Playgroud)
而且,loadPaths不是递归的。因此,如果子文件夹中包含任何 jar,则还必须包含这些子文件夹的路径。IE
This.javaSettings = {loadPaths: ["/jar/batik-1.7","/jar/batik-1.7/lib"]};
Run Code Online (Sandbox Code Playgroud)
如果您对 进行更改this.javaSettings,请务必重新启动应用程序以确保应用更改。
找不到 ColdFusion组件或接口
当您使用 时createObject,您需要包含对象“类型”。否则,它使用默认类型“组件”。意味着 CF 正在搜索具有您提供的路径的组件/cfc ,即“org.apache.batik.transcoder.image.PNGTranscoder”。由于您的应用程序可能不包含具有该路径的 cfc,因此您会收到上述错误消息。
"java"为您的所有调用添加类型createObject,它应该可以工作:
createObject("java", "org.apache.batik.transcoder.image.PNGTranscoder").init();
Run Code Online (Sandbox Code Playgroud)