使用Leiningen制作Uberjar时如何针对特定版本的Java进行定位

9
我使用Lein uberjar创建了一个独立的jar文件,在我运行Java 1.8的笔记本电脑上完全正常。但是,我学校的计算机运行的是Java 1.7.0_60。

在我的project.clj中,我添加了:javac-options ["-target 1.7"]以便编译到Java 1.7,但是这将返回与编译为Java 1.8时相同的错误。错误为:Unsupported major.minor version 52

也许在我的project.clj中添加:javac-options ["-target 1.7"]对编译的版本没有影响,我不确定,请帮忙!

1
你的project.clj文件是什么样子的?你是否依赖于任何可能已经使用Java 8编译的库? - Diego Basch
1
问题出在其中一个使用的库上。谢谢! - Willyb
2个回答

5
当前,Clojure编译成的Java类向后兼容Java 1.6,因此问题不在于Leiningen中的javac选项。我在我的一个项目中遇到了同样的问题。问题在于你使用的一个库编译的Java版本太新了。当你构建一个überjar时,Leiningen只是将依赖库中的类文件复制到其中,所以你得到了它们拥有的任何类文件版本。
解决这个问题的方法是,在我的情况下,我必须在Github上分叉依赖项目并生成Java 1.6兼容的类,然后让我的Leiningen项目依赖于分叉而不是主要项目。

在我的情况下,我能够将一个依赖项回滚到之前与我的服务器的“1.7”兼容的版本。然而,即使是更新的依赖版本也在其“project.clj”中具有“:javac-options [“-target” “1.6”]”,因此除了软件包版本的发布日期和您的uberjars在运行时崩溃外,我找不到一种简单的方法来测试兼容性。 - Jacob Ford

0

看起来你在错误地使用 :javac-options。尝试按照 Lein 文档中提到的方式使用此选项::javac-options ["-target" "1.6" "-source" "1.6" "-Xlint:-options"]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接