2016-09-28 4 views
0

J'ai vérifié les doublons possibles pour cette question, et je n'ai pas trouvé un qui répond à mon problème. La plupart d'entre eux s'arrêtent de nommer le fichier .jar ou le repo maven. J'ai besoin d'aide pour regarder dans un dépôt local et son pot pour importer des cours. Le SO répond que j'ai trouvé que l'adresse import n'adresse pas de repos local.Importation de classes Java dans Clojure à partir de repo local?

Considérez ce qui suit project.clj, en notant les deux lignes que j'ai ajoutées à un nouveau projet de Leiningen j'ai créé par lein app sc-tester:

(defproject sc-tester "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.8.0"] 
       [local/scxml "2.2.0"]]  ;;; <<<---=== local jar reference 
    :main ^:skip-aot sc-tester.core 
    :target-path "target/%s" 
    :repositories [["local" "file:local-repo"]] ;;; <<<---=== local repo reference 
    :profiles {:uberjar {:aot :all}}) 

J'ai créé la référence jar locale avec la commande suivante:

lein deploy local local/scxml 2.2.0 ~/Documents/commons-scxml/target/commons-scxml2-2.0-SNAPSHOT.jar 

Cette commande a abouti au contenu suivant: local_repo:

local-repo/ 
`-- local 
    `-- scxml 
     |-- 2.2.0 
     | |-- scxml-2.2.0.jar 
     | |-- scxml-2.2.0.jar.md5 
     | `-- scxml-2.2.0.jar.sha1 
     |-- maven-metadata.xml 
     |-- maven-metadata.xml.md5 
     `-- maven-metadata.xml.sha1 

Un appel de lein deps ne manque pas (mais ce n'est pas la même chose que réussir!):

lein deps :tree 
[clojure-complete "0.2.4" :exclusions [[org.clojure/clojure]]] 
[local/scxml "2.2.0"] 
[org.clojure/clojure "1.8.0"] 
[org.clojure/tools.nrepl "0.2.12" :exclusions [[org.clojure/clojure]]] 

Le fichier jar contient un tas de classes; voici un extrait avec quelques pour le contexte, y compris un couple, SCXML et SCXMLExecutor, je voudrais importer:

$ jar tvf local-repo/local/scxml/2.2.0/scxml-2.2.0.jar 
... 
2275 Mon ... 2016 org/apache/commons/scxml2/model/Script.class 
5857 Mon ... 2016 org/apache/commons/scxml2/model/SCXML.class 
8963 Mon ... 2016 org/apache/commons/scxml2/model/Send.class 
... 
12466 Mon ... 2016 org/apache/commons/scxml2/SCXMLExecutionContext.class 
11358 Mon ... 2016 org/apache/commons/scxml2/SCXMLExecutor.class 
    848 Mon ... 2016 org/apache/commons/scxml2/SCXMLExpressionException.class 
... 

Maintenant, je lance un rempl et commencer à deviner comment nommer ces classes dans un appel de import:

$ lein repl 
nREPL server started on port 60765 on host 127.0.0.1 - nrepl://127.0.0.1:60765 
REPL-y 0.3.7, nREPL 0.2.12 
Clojure 1.8.0 
Java HotSpot(TM) 64-Bit Server VM 1.8.0_101-b13 
... 

sc-tester.core=> (import 'local/scxml.SCXML) 
ClassNotFoundException scxml.SCXML java.net.URLClassLoader.findClass 
(URLClassLoader.java:381) 
sc-tester.core=> (import 'local/scxml/org/apache/commons/scxml2/model/SCXML) 
ClassNotFoundException scxml/org/apache/commons/scxml2/model/SCXML 
java.lang.Class.forName0 (Class.java:-2) 

Hmmm. Un type d'erreur différent, mais toujours pas d'aide pour trouver la bonne réponse. Essayons un point dans un endroit aléatoire au lieu d'une barre oblique:

sc-tester.core=> (import 'local/scxml.org/apache/commons/scxml2/model/SCXML) 
ClassNotFoundException scxml.org/apache/commons/scxml2/model/SCXML 
java.lang.Class.forName0 (Class.java:-2) 

Essayons presque tous-points:

sc-tester.core=> (import 'local/scxml.org.apache.commons.scxml2.model.SCXML) 
ClassNotFoundException scxml.org.apache.commons.scxml2.model.SCXML 
java.net.URLClassLoader.findClass (URLClassLoader.java:381) 

LET'S essayez d'enlever le nom du repo:

sc-tester.core=> (import 'org/apache/commons/scxml2/model/SCXML) 
ClassNotFoundException apache/commons/scxml2/model/SCXML 
java.lang.Class.forName0 (Class.java:-2) 

etc., etc., etc. (essayé de permutations et de suppositions).

Questions:

  1. Ai-je mis en place correctement le repo local, autrement dit, est-il même possible pour nommer correctement les cours dans un appel de import avec mon set-up?

  2. Si oui, comment puis-je importer les classes java dans Clojure? Quelle est la bonne syntaxe pour nommer ces bêtes?

Répondre

3

Vous devriez être en mesure d'importer des classes de tout pot sur votre classpath en utilisant seulement le nom de classe et package:

(import 'org.apache.commons.scxml2.model.SCXML) 

Si cela ne fonctionne pas, le pot est pas sur votre chemin de classe et vous devrait résoudre ce problème en premier.

+1

Travail effectué. La recette est "couper le nom de repo sur le devant et remplacer toutes les barres obliques avec des points." Mon collègue d'à côté m'a aussi appris que c'est la notion d'un «paquet» Java et m'a montré un petit exemple. Les lumières s'allument. –