2

Java と clojure で実装された、実行する 1 つの 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

1 つの jar ファイルの作成

この構造を持つ jar ディレクトリを 1 つ作成しました。

├── 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

で1つのjarファイルを取得できましたjar cvfm hello.jar jar/MANIFEST.MF HelloJava.class

ただし、この jar ファイルには clojure jar ファイル (ThingOne-1.0.0-SNAPSHOT-standalone.jar) は含まれておらず、参照されているだけです。

Java クラス ファイルと clojure jar ファイルを含む 1 つの jar ファイルを作成するにはどうすればよいですか?

4

2 に答える 2

1

私が理解している限り、あなたのユースケースは次のとおりです。主に Java アプリケーションがあり、Java からいくつかの Clojure 関数を利用したいと考えています。これを行う最善の方法は、Clojure 機能のファサードとして機能する:gen-classを作成することです。詳細については、この投稿をお読みください。

Leiningen が管理する別の Clojure プロジェクトを作成する必要があります。ローカルの mavan リポジトリに公開できるプロジェクトの結果 (Leiningen は Maven のファサードです)。

Java プロジェクトでは、Clojure ライブラリに依存関係を追加します。Maven が処理するため、clojure.jar について心配する必要はありません。

これは Java で開発する標準的な方法です。Clojure 言語とライブラリを含むモノリス Jar を作成しないでください。Leiningen (Maven) を使用する場合は必要ありません。

代替案: Clojure と Java のソースを一緒に保持する場合に、プロジェクトを構成する別の方法を知っています。汚れていますが、機能します。説明してほしい場合は、お知らせください。

編集:プロジェクトをこのように構成すると、そのプロジェクトの uberjar をいつでも作成できます。Maven にはそのためのプラグインがあります。

于 2012-09-11T16:46:38.413 に答える