Java 如何将GEVA集成到Clojure中

Java 如何将GEVA集成到Clojure中,java,interop,clojure,Java,Interop,Clojure,我同时进入Clojure和语法进化,发现了一个用Java编写的通用工具。我没有Java方面的背景。所以我不必重新发明轮子,我怎样才能将GEVA集成到Clojure中 我可以使用以下命令从CLI执行默认脚本: java-jar GEVA.jar-main_类main.Run GEVA源目录具有以下子目录,其中包含以该目录命名的包: 算法com异常拟合分形个体主映射器运算符参数UI Util 主子目录包含以下文件和教程子目录: AbstractRun.java实验.java运行.java状态.jav

我同时进入Clojure和语法进化,发现了一个用Java编写的通用工具。我没有Java方面的背景。所以我不必重新发明轮子,我怎样才能将GEVA集成到Clojure中

我可以使用以下命令从CLI执行默认脚本: java-jar GEVA.jar-main_类main.Run

GEVA源目录具有以下子目录,其中包含以该目录命名的包: 算法com异常拟合分形个体主映射器运算符参数UI Util

主子目录包含以下文件和教程子目录: AbstractRun.java实验.java运行.java状态.java教程

Run.java文件中包含以下类: 公共类运行扩展了AbstractRun 公营 公共无效实验(字符串[]args) 公共无效设置(字符串[]参数) 私有无效设置种子() 公共静态void main(字符串[]args)

据我所知,main.Run类中的静态方法“main”是我想要执行的。但是,当我尝试按照Java互操作说明进行操作时,会出现错误

clgeva.test=> (.Main.Run/main)
java.lang.Exception: No such namespace: .Main.Run (NO_SOURCE_FILE:5)
clgeva.test=> (.Main.Run/main "")
java.lang.Exception: No such namespace: .Main.Run (NO_SOURCE_FILE:6)
我显然没有正确导入名称空间来运行主函数

user=> (import Main)
java.lang.ClassNotFoundException: Main (NO_SOURCE_FILE:1)
user=> (import Main.Run)
Main.Run
user=> (main)
java.lang.Exception: Unable to resolve symbol: main in this context (NO_SOURCE_FILE:3)
user=> (.Main.Run/main)
java.lang.Exception: No such namespace: .Main.Run (NO_SOURCE_FILE:4)

我到底做错了什么?我确信我只是错过了一些明显的东西,但我已经在这上面撞了一段时间,需要一些指导。谢谢。

首先,确保正确加载GEVA库-请参阅 根据java.lang.ClassNotFoundException错误,我猜测GEVA不在您的类路径上


然后,您需要查看Java互操作的Clojure文档:

您的想法是正确的,但确实存在一些语法错误

clgeva.test=> (.Main.Run/main)
在点运算符和Main.Run/Main引用之间应该有一个空格。事实上,它试图找到一个名为“.Main.Run”的东西,它显然不存在。这样做:

clgeva.test=> (. Main.Run/main)
假设类路径设置正确,它应该可以工作


使用
(import…
导入类并调用
(main)
将不起作用,因为
main
是一个静态方法。

调用没有参数的静态方法的语法(我将使用每个人都可以访问的示例)是:

首选上述形式,但也可以使用以下形式,并可用于宏:

=> (. java.lang.System currentTimeMillis)
1284574477369
在本例中,“java.lang.”可能会被省略,但我将其包括在内,以便更接近您的情况

=> (System/currentTimeMillis)
1284574617771
无论是否有空格,在第一个窗体中添加点都不起作用:

user=> (.System/currentTimeMillis) 
java.lang.Exception: No such namespace: .System (NO_SOURCE_FILE:44)
user=> (. System/currentTimeMillis)
java.lang.IllegalArgumentException: Malformed member expression, expecting (. target member ...) (NO_SOURCE_FILE:45)

我尝试了几种加载类路径的方法。我运行的第一种方法是将GEVA.jar文件复制到leiningen lib文件夹中,然后执行'lein repl'。另一种方法是手动执行“java-cp clojure.jar:clojure contrib.jar:GEVA.jar-jar clojure.main”。实际上……我不在我的机器前面……我想我在前面的注释的手动执行中没有-jar。对于leiningen,您想在project.clj中的DEFPROJECT表单中将GEVA指定为依赖项(参见示例).这个答案最能说明我做错了什么。我正确地设置了以下内容:这个答案提供了最接近我做错了什么的提示。当jar位于lib文件夹中时,我使用lein repl中的以下内容正确地设置了该类:(ns clgeva.test(:import Main.Run))当我搜索(ns imports ns)的结果时,我找到了“Run Main.Run”,它指示该类作为Run导入。因此,当我运行(Run/main“”)时,我得到了一个classCastException错误,这表明我在正确的路径上。使用以下命令(Run/main(进入数组[“”])修复此问题,使代码按预期执行。谢谢大家的帮助!
user=> (.System/currentTimeMillis) 
java.lang.Exception: No such namespace: .System (NO_SOURCE_FILE:44)
user=> (. System/currentTimeMillis)
java.lang.IllegalArgumentException: Malformed member expression, expecting (. target member ...) (NO_SOURCE_FILE:45)