Clojure:gen-class并在java中导入它;包,路径,类路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clojure:gen-class并在java中导入它;包,路径,类路径相关的知识,希望对你有一定的参考价值。
我想将Clojure代码编译为Java中的类。
Clojure课程:
(ns clj.core)
(gen-class
:name de.wt.TestClj
:state state
:init init
:prefix "-"
:main false
:methods [[setValue [String] void]
[getValue [] String]])
(defn -init []
[[] (atom {:value ""})])
(defn -setValue [this val]
(swap! (.state this) assoc :value val))
(defn -getValue [this]
(@(.state this) :value))
使用lein uberjar
编译并将输出-standalone.jar复制到子目录de/wt
下的Java项目中。
.java文件:
import de.wt.TestClj;
class CljTest {
public static void main(String args[]) {
TestClj test = new TestClj();
System.out.println("Pre: " + test.getValue());
test.setValue("foo");
System.out.println("Post: " + test.getValue());
}
}
现在当我尝试编译时
~/testbed/cljava/java % tree [1 14:44:53]
.
├── CljTest.java
├── de
│ └── wt
│ └── TestClj.jar
└── TestClj.jar
2 directories, 3 files
~/testbed/cljava/java % javac -cp ./:./de/wt/TestClj.jar CljTest.java
CljTest.java:1: error: package de.wt does not exist
import de.wt.TestClj;
^
CljTest.java:5: error: cannot find symbol
TestClj test = new TestClj();
^
symbol: class TestClj
location: class CljTest
CljTest.java:5: error: cannot find symbol
TestClj test = new TestClj();
^
symbol: class TestClj
location: class CljTest
3 errors
在命名文件/包,创建目录和设置类路径时,我需要遵循什么方案?
您应该能够在jar中看到java类,例如:
$ jar tvf target/default-0.1.0-SNAPSHOT-standalone.jar | grep TestClj
2090 Mon Jan 01 18:43:12 CET 2018 de/wt/TestClj.class
如果没有,请确保project.clj中有:aot
(提前编译)指令:
(defproject default "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"}
:aot [clj.core]
:dependencies [[org.clojure/clojure "1.7.0"]])
一旦在jar中看到.class
文件,在类路径中使用jar,你在Java代码中的导入应该可以正常工作。
正如文档中所述(https://clojure.org/reference/compilation):
Clojure将您即时加载的所有代码编译为JVM字节码,但有时候提前编译(AOT)是有利的。使用AOT编译的一些原因是:
无需源代码即可交付应用程序
加快应用程序启动
生成供Java使用的命名类
创建不需要运行时字节码生成和自定义类加载器的应用程序
另见http://clojure-doc.org/articles/language/interop.html:
AOT
gen-class
需要提前编译(AOT)。这意味着在使用gen-class
定义的类之前,Clojure编译器需要从gen-class
定义生成.class文件。
以上是关于Clojure:gen-class并在java中导入它;包,路径,类路径的主要内容,如果未能解决你的问题,请参考以下文章
具有需要枚举参数的注释的 clojure gen-class
在 Clojure 中需要命名空间时出现 FileNotFoundException