2

我想创建一个用 java 和 clojure 实现的 jar 文件来执行。这是我采取的步骤。

让我的 java 代码调用 clojure 代码

我可以生成一个具有 clojure 核心和我的 clojure 代码的 jar 文件 (ThingOne-1.0.0-SNAPSHOT-standalone.jar),我还可以获得一个使用 jar 文件中的 clojure 代码的类文件 (HelloJava.class)通过关注这个网站 - http://walkwithoutrhythm.net/blog/2012/03/26/how-to-call-clojure-1-dot-3-functions-from-java/

java代码如下:clojure代码导入为ThingOne

import ThingOne.*;

public class HelloJava {
    public static void main(String[] args) {
        System.out.println("Hello from Java!");
        core.foo (12345);
    }
}

我可以运行这个命令来使用代码:

java -cp 'ThingOne-1.0.0-SNAPSHOT-standalone.jar:.' HelloJava

制作一个jar文件

我制作了一个具有这种结构的 jar 目录。

├── MANIFEST.MF
└── jar
    └── ThingOne-1.0.0-SNAPSHOT-standalone.jar

MANIFEST.MF 的内容是

Manifest-Version: 0.1
Main-Class: HelloJava
Class-Path: jar/ThingOne-1.0.0-SNAPSHOT-standalone.jar

我可以得到一个 jar 文件jar cvfm hello.jar jar/MANIFEST.MF HelloJava.class

但是,clojure jar 文件(ThingOne-1.0.0-SNAPSHOT-standalone.jar)没有包含在这个 jar 文件中,只是被引用了。

如何制作一个包含 java 类文件和 clojure jar 文件的 jar 文件?

4

2 回答 2

1

如果您想制作一个包罗万象的 jar,请使用以下工具:

如果你特别想打包 jar 文件,你需要一个自定义的类加载器,比如:

话虽如此,我还是会考虑道文的建议,除非你有特殊需要,否则它无法满足。

于 2012-09-10T00:08:16.457 回答
1

据我了解,您的用例如下:您有一个主要是 Java 应用程序,并且您想使用 Java 中的一些 Clojure 函数。最好的方法是创建一个:gen-class作为 Clojure 功能的外观。欲了解更多信息,请阅读这篇文章

您需要创建一个单独的 Clojure 项目,由 Leiningen 管理。您可以将项目结果发布到本地 mavan 存储库(Leiningen 是 Maven 的外观)。

在 Java 项目中将依赖项添加到 Clojure 库中,您不必担心 clojure.jar,因为 Maven 会处理它。

这是一种标准的 Java 开发方式,请不要用 Clojure 语言和你的库创建一个整体 Jar。如果您使用 Leiningen (Maven),则不需要它。

替代方案:我知道另一种构建项目的方法,即 Clojure 和 Java 源代码放在一起。它更脏,但它有效。如果你想让我描述它,请告诉我。

编辑:如果您以这种方式配置项目,则始终可以创建它的 uberjar。Maven 有一个插件

于 2012-09-11T16:46:38.413 回答