2 votes

Comment charger la bibliothèque Java jsoup à partir de Coldfusion 2016 ?

TLDR : La fonction CreateObject lève une exception (java.lang.ClassNotFoundException) car elle ne peut pas voir le fichier java class/JAR.

Une idée de ce que je fais mal ? Merci


Contenu du fichier 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>

Emplacement du fichier JAR

/Volumes/mydrive/work/myapp/java/lib/jsoup-1.12.1.jar

sortie de la cfoutput dans Application.cfc

path: /Volumes/mydrive/work/myapp/java/lib

3voto

Kannan.P Points 865

@mrjayviper, je ne suis pas certain de la raison pour laquelle vous avez ajouté l'élément jsoup-1.12.1.jar en plusieurs fois dans le tableau loadPaths ?

Ainsi que votre PATH = > /Volumes/mydrive/work/myapp/java/lib Mais vous avez passé la valeur dans le tableau loadPaths de la manière suivante #path#/java/lib/jsoup-1.12.1.jar. Alors il faut le considérer comme /Volumes/mydrive/work/myapp/java/lib/java/lib/jsoup-1.12.1.jar Donc c'est totalement faux. C'est une des causes de votre problème.

Ici, je souhaite donner une meilleure solution pour vous avec mon exemple d'application,

La structure des fichiers de mon application simple ressemble à ceci,

  • Application.cfc : Juste le fichier normal Application.cfc qui a this.javaSettings pour charger le fichier jar JSOUP
  • index.cfm : code permettant de récupérer le contenu de la page Web à l'aide de jSoup et d'exécuter l'opération d'analyse syntaxique
  • jsoup-1.8.3.jar : Le fichier jar JSOUP téléchargé

enter image description here

Ensuite, vous pouvez définir le javaSetting dans application.cfc comme ci-dessous

component {
    this.name = "jSoupParser";
    //Loads the JAR File
    this.javaSettings = { loadPaths = [ "#expandPath('./jsoup-1.8.3.jar')#" ], 
                            reloadOnChange = false };
}

Vous pouvez utiliser la fonction expandPath() et indiquer le répertoire actuel de votre application. Ensuite, vous pouvez créer un objet dans votre fichier cfm comme ci-dessous Index.cfm :

<cfset getJsoup = createObject("java", "org.jsoup.Jsoup")> 

J'espère que cela vous aidera davantage. Si vous voulez plus d'explications / de clarifications à ce sujet, veuillez visiter le lien ci-dessous. Mon équipe a déjà donné l'échantillon pour ce jSoup. https://www.mitrahsoft.com/index.cfm/blog/ColdFusion-Web-scraping-HTML-Parsing-using-JSOUP .

1voto

Ageax Points 3783

Bien que, techniquement, il n'y ait rien de mal à utiliser des chemins absolus, vous n'en avez pas besoin dans ce cas. Il est plus simple d'utiliser un chemin relatif, pointant vers un sous-répertoire. Par exemple : ./java/lib De plus, n'incluez pas le même chemin plusieurs fois. .

<cfcomponent>
    <!--- don't forget to name the application ---> 
    <cfset This.name = "SomeUniqueApplicationName">
    <cfset This.javaSettings = { LoadPaths = ["./java/lib/jsoup-1.12.1.jar"] }>
</cfcomponent>

Ainsi, les FC seront en mesure de trouver la classe en cas de besoin.

<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup") />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X