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:
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?Si oui, comment puis-je importer les classes java dans Clojure? Quelle est la bonne syntaxe pour nommer ces bêtes?
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. –