为了做一些多平台的GUI开发,我刚刚从GTK Clojure切换(因为它看起来像GTK的
Java绑定从未被移植到Windows)到SWT Clojure.到目前为止,很好,我已经建立了一个用于
Linux的uberjar.
但是,抓住的是,我想为Windows构建一个uberjar,我试图找出一个干净的方式来管理project.clj文件.
起初,我以为我会设置类路径指向SWT库,然后构建uberjar.这将需要我在运行jar之前在SWT库中设置一个类路径,但是我可能需要一个启动器脚本.然而,在这种情况下,leiningen似乎忽略了类路径,因为它总是报告
目前,project.clj对我来说看起来像这样:
(defproject alyra.mana-punk/character "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/clojure-contrib "1.2.0"] [org.eclipse/swt-gtk-linux-x86 "3.5.2"]] :main alyra.mana-punk.character.core)
相关行是org.eclipse / swt-gtk-linux-x86行.如果我想为Windows制作一个uberjar,我必须依赖于org.eclipse / swt-win32-win32-x86,另一个用于x86-64,依此类推.
我目前的解决方案是使用不同的project.clj简单地为每个构建环境创建一个单独的分支.这似乎就像使用半加一加仑的牛奶,但是我正在使用集市进行版本控制,因此分支和重复的集成很容易.也许更好的方法是有一个project.linux.clj,project.win32.clj等,但是我没有看到任何方式告诉leiningen要使用哪个项目描述符.
什么是其他(优选更优雅)的方式来建立这样的环境?
这是一个非常优雅的解决方案,使用Java系统属性:
原文链接:/javaschema/281777.html(let [properties (select-keys (into {} (System/getProperties)) ["os.arch" "os.name"]) platform (apply format "%s (%s)" (vals properties)) swt (case platform "Windows XP (x86)" '[org.eclipse/swt-win32-win32-x86 "3.5.2"] "Linux (x86)" '[org.eclipse/swt-gtk-linux-x86 "3.5.2"])] (defproject alyra.mana-punk/character "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/clojure-contrib "1.2.0"] ~swt] :main alyra.mana-punk.character.core))