如何从 Coldfusion 2016 中加载 jsoup Java 库?
How do I load jsoup Java library from inside Coldfusion 2016?
TLDR:CreateObject 函数抛出异常 (java.lang.ClassNotFoundException),因为它看不到 java class/JAR 文件。
知道我做错了什么吗?谢谢
Application.cfc
的内容
<cfcomponent output="true">
<cfset path = "#Mid(CGI.CF_TEMPLATE_PATH, 1, FindNoCase("index.cfm", CGI.CF_TEMPLATE_PATH)-2)#/java/lib" />
<cfoutput>path: #path#</cfoutput>
<cftry>
<cfset This.javaSettings = {LoadPaths = ["#path#/", "#path#/java/lib/jsoup-1.12.1.jar", "./java/lib/", "./java/lib/jsoup-1.12.1.jar"], loadColdFusionClassPath = true, reloadOnChange = true}>
<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup") />
<cfcatch type="any">
<cfdump var="#cfcatch#" />
</cfcatch>
</cftry>
<cfabort>
</cfcomponent>
JAR 文件位置
/Volumes/mydrive/work/myapp/java/lib/jsoup-1.12.1.jar
里面cfoutput的输出Application.cfc
path: /Volumes/mydrive/work/myapp/java/lib
@mrjayviper,我不确定你为什么在 loadPaths 数组中多次添加 jsoup-1.12.1.jar?
和你的 PATH = > /Volumes/mydrive/work/myapp/java/lib
一样,但是你已经在 loadPaths 数组中传递了值,比如 #path#/java/lib/jsoup-1.12.1.jar.
那么它应该认为它是 /Volumes/mydrive/work/myapp/java/lib/java/lib/jsoup-1.12.1.jar
所以这是完全错误的。这是你的问题的一个原因。
在这里,我希望通过我的示例应用程序为您提供一些更好的解决方案,
我的简单应用程序文件结构如下所示,
- Application.cfc : 只是正常的 Application.cfc 文件
this.javaSettings 加载 JSOUP jar 文件
- index.cfm : 有使用 jSoup 获取网页内容的代码 & 执行解析操作
- jsoup-1.8.3.jar : 下载的 JSOUP jar 文件
然后你可以在application.cfc文件中设置javaSetting,如下所示
component {
this.name = "jSoupParser";
//Loads the JAR File
this.javaSettings = { loadPaths = [ "#expandPath('./jsoup-1.8.3.jar')#" ],
reloadOnChange = false };
}
您可以使用 expandPath() 并指出您当前的应用程序目录。
然后你可以在你的 cfm 文件中创建一个对象,如下所示
Index.cfm :
<cfset getJsoup = createObject("java", "org.jsoup.Jsoup")>
希望对您有所帮助。如果您想对此进行更多解释/澄清,请访问下方 link。我的团队已经为这个 jSoup 提供了示例。 https://www.mitrahsoft.com/index.cfm/blog/ColdFusion-Web-scraping-HTML-Parsing-using-JSOUP。
尽管从技术上讲使用绝对路径没有任何问题 - 在这种情况下您不需要它们。使用相对路径更简单,指向子目录。例如:./java/lib
此外,不要多次包含相同的路径。
<cfcomponent>
<!--- don't forget to name the application --->
<cfset This.name = "SomeUniqueApplicationName">
<cfset This.javaSettings = { LoadPaths = ["./java/lib/jsoup-1.12.1.jar"] }>
</cfcomponent>
然后CF就可以在需要的时候找到class。
<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup") />
TLDR:CreateObject 函数抛出异常 (java.lang.ClassNotFoundException),因为它看不到 java class/JAR 文件。
知道我做错了什么吗?谢谢
Application.cfc
的内容<cfcomponent output="true">
<cfset path = "#Mid(CGI.CF_TEMPLATE_PATH, 1, FindNoCase("index.cfm", CGI.CF_TEMPLATE_PATH)-2)#/java/lib" />
<cfoutput>path: #path#</cfoutput>
<cftry>
<cfset This.javaSettings = {LoadPaths = ["#path#/", "#path#/java/lib/jsoup-1.12.1.jar", "./java/lib/", "./java/lib/jsoup-1.12.1.jar"], loadColdFusionClassPath = true, reloadOnChange = true}>
<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup") />
<cfcatch type="any">
<cfdump var="#cfcatch#" />
</cfcatch>
</cftry>
<cfabort>
</cfcomponent>
JAR 文件位置
/Volumes/mydrive/work/myapp/java/lib/jsoup-1.12.1.jar
里面cfoutput的输出Application.cfc
path: /Volumes/mydrive/work/myapp/java/lib
@mrjayviper,我不确定你为什么在 loadPaths 数组中多次添加 jsoup-1.12.1.jar?
和你的 PATH = > /Volumes/mydrive/work/myapp/java/lib
一样,但是你已经在 loadPaths 数组中传递了值,比如 #path#/java/lib/jsoup-1.12.1.jar.
那么它应该认为它是 /Volumes/mydrive/work/myapp/java/lib/java/lib/jsoup-1.12.1.jar
所以这是完全错误的。这是你的问题的一个原因。
在这里,我希望通过我的示例应用程序为您提供一些更好的解决方案,
我的简单应用程序文件结构如下所示,
- Application.cfc : 只是正常的 Application.cfc 文件 this.javaSettings 加载 JSOUP jar 文件
- index.cfm : 有使用 jSoup 获取网页内容的代码 & 执行解析操作
- jsoup-1.8.3.jar : 下载的 JSOUP jar 文件
然后你可以在application.cfc文件中设置javaSetting,如下所示
component {
this.name = "jSoupParser";
//Loads the JAR File
this.javaSettings = { loadPaths = [ "#expandPath('./jsoup-1.8.3.jar')#" ],
reloadOnChange = false };
}
您可以使用 expandPath() 并指出您当前的应用程序目录。
然后你可以在你的 cfm 文件中创建一个对象,如下所示
Index.cfm :
<cfset getJsoup = createObject("java", "org.jsoup.Jsoup")>
希望对您有所帮助。如果您想对此进行更多解释/澄清,请访问下方 link。我的团队已经为这个 jSoup 提供了示例。 https://www.mitrahsoft.com/index.cfm/blog/ColdFusion-Web-scraping-HTML-Parsing-using-JSOUP。
尽管从技术上讲使用绝对路径没有任何问题 - 在这种情况下您不需要它们。使用相对路径更简单,指向子目录。例如:./java/lib
此外,不要多次包含相同的路径。
<cfcomponent>
<!--- don't forget to name the application --->
<cfset This.name = "SomeUniqueApplicationName">
<cfset This.javaSettings = { LoadPaths = ["./java/lib/jsoup-1.12.1.jar"] }>
</cfcomponent>
然后CF就可以在需要的时候找到class。
<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup") />