如何从 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") />