كيف تدير الجرة المصنوعة من أمر "لين جرة"؟
سؤال
هذه متابعة ل هذا السؤال.
بعد تشغيل "Lein Jar" ، أحصل على "MyProject -1.0.0.0.snapshot.jar" ، والذي لا يحتوي على clojure-1.2.0-beta1.jar و clojure-contrib-1.2.0-beta1.jar.
وتشغيل "Lein Uberjar" يعطيني ملفين جرة. الأول (الذي ينتهي بـ -standalone.jar) هو الجرة التي تحتوي على كل شيء ، والثاني هو نفسه الجرة الناتجة عن "جرة لين".
هذا هو مسألة الجرة مع الثانية. لا توجد مشكلة في الركض مع الجرة الأولى ، كما أوضحت في السابق بريد.
عندما أركض
java -cp PATH_TO_THE_CLOJURE_AND_CONTRIB.jar:$CLASSPATH -jar myproject-1.0.0-SNAPSHOT.jar'
, ، أحصل على الخطأ التالية.
Caused by: java.lang.ClassNotFoundException: clojure.lang.IFn at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
ما قد يكون خطأ ، اعتقدت أنه يمكنني استخدام "myproject -1.0.0-snapshot.jar بنفس الطريقة مع" myProject -1.0.0-snapshot-standalone.jar "إذا كنت أشير إلى ملفات JAR باستخدام خيار -CP.
هل هناك أي شيء كان علي فعله؟
وأضاف
java -cp ALLTHE_JAR_PATH myproject.core
يحل المشكلة.
المحلول
إذا كنت تستخدم Lininingen 1.2 ، فمن المحتمل أن تتعرض لخطأ حيث يتم حذف التبعيات قبل إنشاء uberjar (من الواضح أنه يهزم نقطة أوبرجار). يرجى إما خفض التصنيف إلى 1.1 وانتظار الإصدار الجديد (الذي يجب أن يصل قريبًا) أو استخدام الخروج من رأس لين (كما هو موضح في القسم الخاص بـ Lininingen في Lein's Readme).
بمجرد القيام بذلك ، يجب أن تكون قادرًا على إنتاج جرة مستقلة lein uberjar
ويقول java -jar name-of-your-standalone.jar
لإطلاق التطبيق الخاص بك.
كبديل ، يمكنك إنشاء جرة عادية مع lein jar
ويقول شيئًا مثل java -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.main
(أين your-app.main
هل الفصل الرئيسي لطلبك ؛ أيضا ، استبدال $PROJECT_ROOT
مع المسار المناسب وتزويد الطريق إلى your-app.jar
, ، بالتاكيد). ال lib/*
سيعمل الشيء فقط على JDK 1.6 ؛ مع 1.5 يجب عليك تضمين كل جرة بشكل منفصل. لاحظ أنه عند استخدام -jar
, -cp
و $CLASSPATH
يتم تجاهلها ؛ فقط classpath المحدد في بيان الجرة (إن وجد) يتم أخذها في الاعتبار.