【问题标题】:Easiest way to manage my CLASSPATH?管理我的 CLASSPATH 的最简单方法是什么?
【发布时间】:2009-12-23 08:52:55
【问题描述】:

我开始使用 Clojure,但我的 Java 经验非常有限。我来自 Ruby 和 OO 的动态世界,所以功能方面非常有趣!

无论如何,当我发现库和各种使用工具(以及 Pragmatic Clojure Book 的教程文件)时,一切通常都需要将文件放在 CLASSPATH 中,以便 Clojure 看到要使用的库。

有没有好的 CLASSPATH 实践?我是否只想拥有一个只包含我需要的外部文件库的 CLASSPATH,或者我可以继续将我需要的任何库或文件扔到一个目录中,然后简单地将其定义为我的 CLASSPATH 并且只需要需要的文件吗?

如果有帮助,我是 OSX 和 Emacs 用户(使用 slime 和 swank-clojure)。

【问题讨论】:

    标签: java configuration clojure classpath


    【解决方案1】:

    我建议使用 leiningen 和 lein-swank 来管理它。您可以在目录中启动 REPL 并从 Emacs 连接到它。

    【讨论】:

      【解决方案2】:

      就我个人而言,我正在使用 Phil Hagelberg 的 clojure-project elisp 函数的变体,请参阅 Clojure 组的 this post 中的源代码。它为您将要处理的项目适当地设置类路径,然后启动 SLIME。 (编辑:您需要将分配给swank-clojure-jar-path 的值更改为指向clojure.jar。我使用(expand-file-name "~/.clojure/clojure.jar") 作为默认值。)

      要回答关于始终将所有内容放在类路径上而不是只放入所需内容的问题:据我所知,如果您采用第一种方法,实际上不会有任何问题(我知道我这样做是为了实验目的),但是显然第一种方法可能会破坏(参见下面cjstehno的评论),在一个合适的项目中,我发现第二种方法更干净。在某些时候,有必要确定正在使用哪些库(以及它们的哪些版本),如果只是告诉 leiningen(或 maven) - 为什么不随时关注它。

      【讨论】:

      • 实际上,如果您将所有内容都放在类路径中,您可能会遇到问题,尤其是类加载器冲突或错误的类加载。通常最好只在特定应用程序的类路径中包含您需要的内容。
      • 哦,我明白了。显然到目前为止我很幸运,但我会记住这一点,以备不时之需。感谢您的评论,将进行相应的编辑。
      • 哦,我喜欢 Phil 的 clojure-project 实施,我想我会试一试,稍后再报告。谢谢!
      • 嗯,我可以继续寻找一个项目,但粘液在尝试轮询连接时卡住了,它只是挂起。我必须解决这个问题,但我喜欢它的发展方向。谢谢!
      • 当然。 :-) 您需要将swank-clojure-jar-path 更改为指向clojure.jar 才能使其工作;发帖的时候忘记了。将相应地进行编辑。我认为有了这个修复,整个事情应该可以工作......
      【解决方案3】:

      我们正在使用 Clojure 并使用许多基础设施工具,尤其是 Eclipse (IDE) (http://en.wikipedia.org/wiki/Eclipse_%28software%29) 和 maven (http://en.wikipedia.org/wiki/Apache_Maven)。 maven 管理库和 jar 依赖项,所以如果你有很多这些并且它们可能会增长,请开始使用 maven。

      在回答您最初的问题时,您只需将 jar 放在一个目录中,每次运行时都可以按名称访问它们。但是您将从这些工具中受益...

      如果您只是在探索,那么 Eclipse 可能会相当轻松地管理您的 jar 文件。您可以根据需要通过 Build Path -> Configure Build Path 选项将这些添加到项目中。

      随着您的工作进展,您可能希望将其拆分为 Eclipse 支持的项目,以便您可以将您的(或其他项目)添加到您的构建路径中。

      如果您使用外部 Clojure 库,请查看它们是否已打包为 maven 项目(它们将具有 pom.xml 文件)。 POM 将给出依赖项列表。 #

      【讨论】:

      • 不幸的是,Eclipse 是不可能的。就像我提到的,Emacs 是我用于 Clojure 开发的。
      【解决方案4】:

      Java 通常的 CLASSPATH 做法是仅将项目所需的 jar 文件放入此项目的类路径中,这意味着不同项目可能具有不同的类路径。这通常由 IDE 作为其项目属性的一部分进行管理。

      由于您使用的是 Emacs,因此可能没有或不使用类似项目的东西,因此为所有与 clojure 相关的东西设置和使用单个全局类路径可能更方便,甚至可以简单地将所有需要的 jar 文件到 java 安装的 java2se/jre/lib/ext 目录中。

      在您的类路径中包含未定义的 jar 文件可能导致的两个主​​要问题是:1. 它对 JVM 的启动时间有轻微的负面影响,以及 2. 确保您是在同一类路径中没有具有不同版本的类(即不同的类在不同的 jar 文件中具有相同的包和名称)。

      【讨论】:

        【解决方案5】:

        从 Java SE 1.6(或 JDK 1.6)开始,您可以通过通配符包含类路径条目。如果您的类文件位于 .\bin 中,而您的库 jar 文件位于 .\lib 中,那么在 Windows 上您可以像这样定义您的类路径:

        set CLASSPATH=bin;lib\*;
        

        这将允许您将 jar 文件添加到 .\lib 目录中,它们将自动添加到 JRE 的新实例的类路径中。

        详情见此链接:Setting the class path

        在 JDK 1.6 之前,您必须将每个 jar 文件单独添加到 ClassPath 中。

        【讨论】:

          【解决方案6】:

          我刚刚发现了这一点,我需要试一试:

          (setq swank-clojure-extra-classpaths (list "/class/path/1" "/class/path/2" "/class/path/3" "etc"))

          【讨论】:

            【解决方案7】:

            clojure-contrib/launchers/bash/clj-env-dir 有一个有趣的属性,您可以将它指向一个目录,它基本上会包含其中的任何内容。在过去,我有一个 ~/classpath 目录,我会将任何 jar 文件转储到该目录中并链接任何常用目录,并且效果很好。非常简单的转储和使用方法。现在我倾向于使用 Maven clojure-maven-plugin,它也很有效,但是当你只是想乱七八糟的时候可能会有点乏味。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-13
              相关资源
              最近更新 更多