2

这真的很重要,我完全被难住了,而且在截止日期前。非常感谢您的帮助。

我有一个名为 red-black 的 Clojure 项目,其中特别包含一个名为 interval_tree.clj 的文件

我一直在用 lein uberjar 编译这个项目,然后通过将它安装在本地 maven 存储库中来在其他项目中使用生成的 jar。

mvn install:install-file  \   
    -Dfile=../red-black/target/red-black-0.1.0.jar  \  
    -DgroupId=self   \
    -DartifactId=red-black  \
    -Dversion=0.1.0  \
    -Dpackaging=jar  \
    -DgeneratePom=true  \
    -DcreateChecksum=true  \
    -DlocalRepositoryPath=local_mvn_repo

疯狂的是,我添加了一个新函数,编译了我的 jar 并重新安装在另一个项目的本地 maven 存储库中,现在 java 找不到我的新函数

user=> (red-black.interval-tree/tree-to-flat-list )
CompilerException java.lang.RuntimeException: No such var: red-black.interval-tree/tree-to-flat-list, compiling (NO_SOURCE_PATH:1:1)

然而这个函数在 red-black.interval-tree.clj 中!我什至进入了我的 local_mvn_repo,解压缩了 jar,并查看了 interval_tree.clj 源代码。功能就在里面!

更奇怪的是,该库中的其他功能是可以访问的。例如,在我使用本地 mvn 存储库的第二个项目中:

user=> (use 'red-black.interval-tree)
nil

现在是一个小标签标签魔术:

user=> (red-black.interval-tree/
red-black.interval-tree/add-to-result        red-black.interval-tree/black                red-black.interval-tree/check-max-interval
red-black.interval-tree/get-color            red-black.interval-tree/get-hash             red-black.interval-tree/get-interval
red-black.interval-tree/get-key              red-black.interval-tree/get-left             red-black.interval-tree/get-max
red-black.interval-tree/get-parent           red-black.interval-tree/get-right            red-black.interval-tree/get-root
red-black.interval-tree/get-sentinel         red-black.interval-tree/get-value            red-black.interval-tree/has?
red-black.interval-tree/health-check         red-black.interval-tree/high                 red-black.interval-tree/insert
red-black.interval-tree/insert-fixup         red-black.interval-tree/left-rotate          red-black.interval-tree/low
red-black.interval-tree/max-of-three         red-black.interval-tree/new                  red-black.interval-tree/node
red-black.interval-tree/point-lookup         red-black.interval-tree/pretty-print         red-black.interval-tree/recursive-max
red-black.interval-tree/red                  red-black.interval-tree/right-rotate         red-black.interval-tree/set-color
red-black.interval-tree/set-interval         red-black.interval-tree/set-key              red-black.interval-tree/set-left
red-black.interval-tree/set-max              red-black.interval-tree/set-parent           red-black.interval-tree/set-right
red-black.interval-tree/set-root             red-black.interval-tree/set-value            red-black.interval-tree/update-max
user=> (red-black.interval-tree/

但正如您所见,缺少功能树到平面列表。当我回到我的红黑项目并启动 repl 时,我可以调用该项目只是 find。帮助!截至 5 小时前,我正在我的红黑项目中创建新方法,编译我的 uberjar 并通过本地 maven install 将其安装到我的另一个项目中,并且新方法被很好地采用。好像很不对劲,求指教!

更新:

这个问题的一个自包含的例子在这个 tarball 中:

http://gorillamatrix.com/files/foo.tar.gz

进入 foo-two 和 lein repl。尝试加载 foo-two.core,你应该会看到:

user=> (use 'foo-two.core)
CompilerException java.lang.RuntimeException: No such var: foo-one.core/bar, compiling:(foo_two/core.clj:6:2)

但是 foo-one.core/bar 肯定是定义的!

4

1 回答 1

5

lein 不会将已经获取的(从 local_mvn_repo).jar 更新到 .m2/repositories 如果它具有相同的版本(看起来),所以你仍然使用它获取的第一个(它总是使用那个在.m2而不是local_mvn_repo中的那个)所以你可以增加版本并重新安装(确保你也在使用它的项目的project.clj中更新版本)或者(如果仍然使用相同的版本)只是从/中删除它.m2/repositories 以便 lein 可以再次获取它(来自 local_mvn_repo)

于 2013-05-25T08:26:56.163 回答