clojure - lein uberjar 导致“方法代码太大!”
问题描述
我有一个使用 clojure 运行良好的项目lein run
,但lein uberjar
结果是
java.lang.RuntimeException: Method code too large!, compiling:(some_file.clj:1:1)
对于同一个项目。我可以使用包含 2000 多个条目的大型向量将其追溯到 some_file.clj ,该向量的定义如下:
(def x
[[1 :qwre :asdf]
[2 :zxcv :fafa]
...
])
从该向量中删除足够的条目时,lein uberjar
编译没有问题。我怎样才能让 uberjar 完成它的工作,将所有条目留在向量中?
NB 当更改x
为常量 a la(def ^:const x
时,lein run
也会抛出一个Method 太大!错误。x
顺便说一句,这个错误发生在使用的地方,所以只要定义常量就可以了,如果它没有被使用的话。
解决方案
Java 中方法的大小有 64kb 的限制。在您的情况下,创建大向量文字的方法似乎超出了此限制。
实际上,您可以使用一个名为clj-java-decompiler
. 这是一个使用的简短示例boot
:
(set-env!
:dependencies '[[com.clojure-goes-fast/clj-java-decompiler "0.1.0"]])
(require '[clj-java-decompiler.core :as d])
(d/decompile-form
{}
[[1 :qwre :asdf]
[2 :zxcv :fafa]
[3 :zxcv :fafa]])
;; ==> prints:
;;
;; // Decompiling class: cjd__init
;; import clojure.lang.*;
;;
;; public class cjd__init
;; {
;; public static final AFn const__10;
;;
;; public static void load() {
;; const__10;
;; }
;;
;; public static void __init0() {
;; const__10 = (AFn)Tuple.create((Object)Tuple.create((Object)1L, (Object)RT.keyword((String)null, "qwre"), (Object)RT.keyword((String)null, "asdf")), (Object)Tuple.create((Object)2L, (Object)RT.keyword((String)null, "zxcv"), (Object)RT.keyword((String)null, "fafa")), (Object)Tuple.create((Object)3L, (Object)RT.keyword((String)null, "zxcv"), (Object)RT.keyword((String)null, "fafa")));
;; }
;;
;; static {
;; __init0();
;; Compiler.pushNSandLoader(RT.classForName("cjd__init").getClassLoader());
;; try {
;; load();
;; Var.popThreadBindings();
;; }
;; finally {
;; Var.popThreadBindings();
;; }
;; }
;; }
;;
如您所见,有一种方法__init0
可以为向量字面量创建实际的 Java 对象。给定向量中有足够多的元素,该方法的大小很容易超过 64kb 的限制。
我认为,就您而言,解决此问题的最简单方法是将矢量放入文件中,然后slurp
+ 读取此文件。像这样的东西:
文件 vector.edn
:
[[1 :qwre :asdf]
[2 :zxcv :fafa]
...
]
然后在您的代码中:
(def x (clojure.edn/read-string (slurp "vector.edn"))
推荐阅读
- python - 在字典中查找包含相等值的键列表
- c# - 如何使用 ASP.NET Core 更改数据库的输出文件夹?
- javascript - how to get paragraph element displayed on hovered over input element
- node.js - 我需要 Nginx 用于生产,我可以只使用 Nodejs 服务器吗?
- java - 扩展应该不那么通用的泛型类
- cakephp-3.0 - CakePHP 一些表单在提交时立即重定向而没有表单数据
- shell - 通过使用命令行参数调用 curl 在请求正文中发送数据
- angular - 表单控件的角度设置值给出错误
- .net - Azure Application Insights 是否提供任何内置方法来匿名化用户数据?
- javascript - 如何在Javascript中找到数组中最后一个重复元素的索引?