14

これはこの質問のフォローアップです。

「lein jar」を実行した後、「myproject-1.0.0-SNAPSHOT.jar」を取得します。これには、clojure-1.2.0-beta1.jar と clojure-contrib-1.2.0-beta1.jar が含まれていません。

「lein uberjar」を実行すると、2 つの jar ファイルが生成されます。最初のもの (-standalone.jar で終わる) はすべてが含まれている jar で、2 番目のものは「lein jar」で生成された jar と同じです。

これは、2番目のjarファイルの質問です。以前の投稿で説明したように、最初の jar で問題なく実行できます。

私が走るとき

java -cp PATH_TO_THE_CLOJURE_AND_CONTRIB.jar:$CLASSPATH -jar myproject-1.0.0-SNAPSHOT.jar'

、次のエラーが表示されます。

原因: java.lang.ClassNotFoundException: clojure.lang.IFn
        java.net.URLClassLoader$1.run(URLClassLoader.java:202) で
        java.security.AccessController.doPrivileged(ネイティブメソッド)で
        java.net.URLClassLoader.findClass(URLClassLoader.java:190) で
        java.lang.ClassLoader.loadClass(ClassLoader.java:307) で
        sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) で
        java.lang.ClassLoader.loadClass(ClassLoader.java:248) で

-cpオプションを使用してjarファイルを指定すると、「myproject-1.0.0-SNAPSHOT-standalone.jar」と同じ方法で「myproject-1.0.0-SNAPSHOT.jar」を使用できると思いました。

私がしなければならなかったことは他にありますか?

追加した

java -cp ALLTHE_JAR_PATH myproject.core

問題を解決します。

4

1 に答える 1

12

Leiningen 1.2 を使用している場合は、uberjar の作成前に依存関係が削除されるというバグに見舞われている可能性があります (明らかに uberjar のポイントを無効にしています)。1.1 にダウングレードして、新しいリリース (間もなくリリースされるはずです) を待つか、lein の HEAD のチェックアウトを使用してください (lein の README の Leiningen のハッキングに関するセクションで説明されています)。

それができたら、スタンドアロンの jar を作成してlein uberjarjava -jar name-of-your-standalone.jarアプリを起動するように指示できるはずです。

別の方法として、通常の jar を作成して次のlein jarように言うこともできますjava -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.main(アプリケーションのメイン クラスはどこです。また、適切なパスyour-app.mainに置き換えて、もちろん へのパスを指定します)。これは JDK 1.6 でのみ動作します。1.5 では、すべての jar を個別に含める必要があります。およびを使用する場合は無視されることに注意してください。jar のマニフェスト (存在する場合) で指定されたクラスパスのみが考慮されます。$PROJECT_ROOTyour-app.jarlib/*-jar-cp$CLASSPATH

于 2010-08-03T21:15:29.747 に答える