خطأ في تجميع Leiningen مع ملفات Java التي تشير إلى الفئات التي تم إنشاؤها من ملفات Clojure

StackOverflow https://stackoverflow.com/questions/9336202

سؤال

لدي مشروع Leiningen يقوم بتجميع ملفات Java وClojure.تقوم ملفات Java باستيراد بعض الفئات التي تم إنشاؤها من ملفات Clojure (مع فئة gen).

عندما أقوم بتجميع lein، أحصل على أخطاء في الترجمة عند الواردات في ملفات Java (مشيرًا إلى أنه لا يمكن العثور على الفئات).إذا قمت بإزالة ملفات Java من المشروع، وقمت بتجميع lein، وأضفت ملفات Java مرة أخرى، وقمت بتجميع lein مرة أخرى، فكل شيء يعمل بشكل جيد.

لذلك، يبدو الأمر وكأن ملفات Clojure تحتاج إلى تجميعها قبل ملفات Java.

بالمناسبة، أقوم بتضمين ملفات Clojure التي تم إنشاؤها في قائمة :aot.

ما يحدث الخطأ هنا؟

هل كانت مفيدة؟

المحلول

(لم يتم اختبار الكود الموجود في هذه الإجابة، على الرغم من أنه من المأمول أن يعمل مع Leiningen 1.x (للقيم الحديثة لـ x).)

لينينجن compile تعمل المهمة javac المهمة تلقائيا إذا كان لديك project.clj يحدد أ :java-source-path.وهو يفعل ذلك قبل تجميع مصادر Clojure، لأنني أفترض أن هذا هو الاتجاه المعتاد للتبعية.

للتغلب على هذا، يمكنك استخدام الخطاف:

;;; in leiningen.hooks.clj_first.clj

(ns leiningen.hooks.clj-first
  (:require [leiningen.compile :as leinc]
            [leiningen.javac :as javac]))

(defn compile-clj-first-hook [compile-task project & args]
  (apply compile-task
         (dissoc project :java-source-path)
         args))
  (javac/javac project))

(add-hook #'leiningen.compile/compile compile-clj-first-hook)

ضع هذا في مكان ما على مسار الفصل الدراسي الخاص بك في وقت البناء وأضفه

:hooks [clj-first-hook]

إلى خريطة المشروع الخاص بك.

لاحظ أن javac, ، عند الاتصال مباشرة، لن يتم الاتصال compile.يمكنك أيضًا جعلها مكافئة لـ compile على سبيل المثالعن طريق ربطه بالوظيفة التالية:

(defn javac-hook [javac-task project]
  (if (project ::clj-compiled?)
    (javac/javac project)
    (leinc/compile project)))

الشكل الأخير من compile-clj-first-hook ثم يجب أن يكون

(javac/javac (assoc project ::clj-compiled? true))

(تحضير compile لا يتصل javac على الإطلاق ربما كسر jar / uberjar.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top