问题标签 [uberjar]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1186 浏览

java - 如何使用 Maven 添加外部 jar 库,并有可能遵循完整(内部有外部 jar)打包?

我使用 Maven 并有外部库(煤烟)。我想用 Maven 将此库添加到我的项目中,然后打包到 1 个 uber jar 中。

1)要添加库,我可以使用本地仓库(示例)。

2)要获得一个有依赖关系的罐子,我可以使用 shade-plugin 或其他。

但一起它是行不通的,因为在第一步依赖有范围,并且这个依赖不会被添加到 uber jar 中。

我知道我可以安装 mvn,但它只能在我的机器上运行。

有可能实现我最初的目标吗?

0 投票
4 回答
123 浏览

clojure - 导致 uberimage 构建失败的架构

我正在 Clojure 中开发一个简单的 hello world web 应用程序。但是,在我将Schema库添加到我的项目后,我在尝试使用lein uberjar. 奇怪的是,当开始使用lein dev.

java.lang.RuntimeException: Unable to resolve symbol: missing-required-key in this context, clojure.lang.Compiler.analyze(Compiler.java:6464) at clojure 编译:(server/api.clj:21:17) .lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$VectorExpr.parse(Compiler.java:3126) 在 clojure.lang.Compiler.analyze(Compiler.java:6447) 在 clojure.lang。 Compiler.analyze(Compiler.java:6406) at clojure.lang.Compiler$MapExpr.parse(Compiler.java:2981) at clojure.lang.Compiler.analyze(Compiler.java:6453) at clojure.lang.Compiler.analyze (Compiler.java:6406) 在 clojure.lang.Compiler$MapExpr.parse(Compiler.java:2981) 在 clojure.lang.Compiler.analyze(Compiler.java:6453) 在 clojure.lang.Compiler.analyze(Compiler. java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 在 clojure.lang.Compiler.access$100(Compiler.java:38) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在clojure. .lang.Compiler$LetExpr$Parser.parse(Compiler.java:6050) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure。 lang.Compiler.analyzeSeq(Compiler.java:6632) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze(Compiler.java:6406) at clojure.lang.Compiler$InvokeExpr .parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze(Compiler. java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782)在clojure.lang.Compiler.analyzeSeq(Compiler.java:6644)在clojure.lang.Compiler.analyze(Compiler.java:6445)的clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6100) ) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang .Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang。 Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure.Compiler$LetExpr$Parser.parse(Compiler.java:6100) 在 clojure .lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang.Compiler。clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 的分析(Compiler.java:6445) clojure.lang.Compiler.analyze(Compiler.java:6445) 的 clojure.lang.Compiler.analyze(Compiler.java :6406) at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782) at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6100) at clojure.lang.Compiler.analyzeSeq( Compiler.java:6644) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445 ) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang .Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure.lang。Compiler$LetExpr$Parser.parse(Compiler.java:6100) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler .analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler. java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure.lang.Compiler$FnMethod.parse(Compiler .java:5217) 在 clojure.lang.Compiler$FnExpr.parse(Compiler.java:3846) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6642) 在 clojure.lang.Compiler.analyze(Compiler.java: 6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang。Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze(Compiler.java:6406) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq (Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java: 6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632)。 lang.Compiler$InvokeExpr.parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler .analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler。clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 的 clojure.lang.Compiler.analyze(Compiler.java:6406) 的分析(Compiler.java:6445) clojure.lang.Compiler.analyzeSeq(Compiler .java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java: 3719) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6646)。 lang.Compiler$InvokeExpr.parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler .analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler。clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 的分析(Compiler.java:6445) clojure.lang.Compiler.analyze(Compiler.java:6445) 的 clojure.lang.Compiler.analyze(Compiler.java :6406) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) at clojure.lang.Compiler.analyze(Compiler.java:6445)在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) 在 clojure。 lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze (Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr。在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java) 解析(Compiler.java:3719) :6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java: 5782) 在 clojure.lang.Compiler$FnMethod.parse(Compiler.java:5217) 在 clojure.lang.Compiler$FnExpr.parse(Compiler.java:3846) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6642) ) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang .Compiler.access$100(Compiler.java:38) 在 clojure.lang.Compiler$DefExpr$Parser。在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang.Compiler.analyze(Compiler.java) 解析(Compiler.java:538) :6406) at clojure.lang.Compiler.compile1(Compiler.java:7221) at clojure.lang.Compiler.compile(Compiler.java:7292) at clojure.lang.RT.compile(RT.java:398) at clojure .lang.RT.load(RT.java:438) at clojure.lang.RT.load(RT.java:411) at clojure.core$load$fn__5066.invoke(core.clj:5641) at clojure.core$ load.doInvoke(core.clj:5640) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5446) at clojure.core$compile$fn__5071.invoke (core.clj:5652) 在 clojure.core$compile.invoke(core.clj:5651) 在 user$eval9$fn__16.invoke(form-init1857067608391167398.clj:1) 在 user$eval9。在 clojure.lang.Compiler.eval(Compiler.java:6693) 在 clojure.lang.Compiler.eval(Compiler.java:6703) 在 clojure.lang.Compiler.load(Compiler) 调用(form-init1857067608391167398.clj:1) .java:7130) at clojure.lang.Compiler.loadFile(Compiler.java:7086) at clojure.main$load_script.invoke(main.clj:274) at clojure.main$init_opt.invoke(main.clj:279) clojure.main$initialize.invoke(main.clj:307) at clojure.main$null_opt.invoke(main.clj:342) at clojure.main$main.doInvoke(main.clj:420) at clojure.lang. RestFn.invoke(RestFn.java:421) at clojure.lang.Var.invoke(Var.java:383) at clojure.lang.AFn.applyToHelper(AFn.java:156) at clojure.lang.Var.applyTo(Var .java:700) at clojure.main.main(main.java:37) 原因:java.lang.RuntimeException:无法解析符号:在 clojure.lang.Compiler.resolveIn(Compiler.java:6940) 在 clojure.lang.Compiler.resolve(Compiler.java) 的 clojure.lang.Util.runtimeException(Util.java:221) :6884) at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6845) at clojure.lang.Compiler.analyze(Compiler.java:6427) ... 线程“main”中还有 153 个异常 java.lang.RuntimeException:无法解析符号:在这种情况下缺少必需的键,在 clojure.lang.Compiler.analyze(Compiler.java:6464) 在 clojure.lang.Compiler.analyze 编译:(server/api.clj:21:17) (Compiler.java:6406) 在 clojure.lang.Compiler$VectorExpr.parse(Compiler.java:3126) 在 clojure.lang.Compiler.analyze(Compiler.java:6447) 在 clojure.lang.Compiler.analyze(Compiler. java:6406) 在 clojure.lang.Compiler$MapExpr。clojure.lang.Compiler.analyze(Compiler.java:6406) 的 clojure.lang.Compiler.analyze(Compiler.java:6453) 的 parse(Compiler.java:2981).Compiler$MapExpr.parse(Compiler .java:2981) 在 clojure.lang.Compiler.analyze(Compiler.java:6453) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java: 3719) 在 clojure.lang.Compiler.access$100(Compiler.java:38) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在clojure. .lang.Compiler$LetExpr$Parser.parse(Compiler.java:6050) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure。 lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler。clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 的 clojure.lang.Compiler.analyze(Compiler.java:6406) 的分析(Compiler.java:6445) clojure.lang.Compiler.analyzeSeq(Compiler .java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler. java:5782) 在 clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6100) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang.Compiler.analyze(Compiler.java :6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6632) 在 clojure .lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure。lang.Compiler.analyzeSeq(Compiler.java:6644) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze(Compiler.java:6406) at clojure.lang.Compiler$BodyExpr $Parser.parse(Compiler.java:5782) 在 clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6100) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang。 Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze(Compiler .java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6100) 在 clojure.lang.Compiler。 clojure.lang.Compiler.analyze(Compiler.java: 中的 analyzeSeq(Compiler.java:6644)6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632)。 lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure.lang .Compiler$LetExpr$Parser.parse(Compiler.java:6100) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang。 Compiler.analyzeSeq(Compiler.java:6632) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) at clojure.lang.Compiler.analyze(Compiler .java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5782) 在 clojure.lang.Compiler$FnMethod.parse(Compiler.java:5217) 在 clojure.lang.Compiler$FnExpr.parse(Compiler .java:3846) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6642) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632)在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 在 clojure。 lang.Compiler.analyzeSeq(Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze (Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 在clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler .analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze(Compiler.java:6406) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq( Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java :3719) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 在clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler .analyze(Compiler.java:6445) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyze(Compiler. java:6406) 在 clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) 在 clojure.lang.Compiler.analyze(Compiler.java:6445 ) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler $InvokeExpr.parse(Compiler.java:3719) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6646) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang.Compiler.analyzeSeq( Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.analyze(Compiler.java:6406) 在 clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler .java:5782) 在 clojure.lang.Compiler$FnMethod.parse(Compiler.java:5217) 在 clojure.lang.Compiler$FnExpr.parse(Compiler.java:3846) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6642) 在 clojure.lang.Compiler.analyze(Compiler.java:6445 ) 在 clojure.lang.Compiler.analyzeSeq(Compiler.java:6632) 在 clojure.lang.Compiler.analyze(Compiler.java:6445) 在 clojure.lang.Compiler.access$100(Compiler.java:38) 在 clojure。 lang.Compiler$DefExpr$Parser.parse(Compiler.java:538) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6644) at clojure.lang.Compiler.analyze(Compiler.java:6445) at clojure.lang .Compiler.analyze(Compiler.java:6406) at clojure.lang.Compiler.compile1(Compiler.java:7221) at clojure.lang.Compiler.compile(Compiler.java:7292) at clojure.lang.RT.compile( RT.java:398) 在 clojure.lang.RT.load(RT.java:438) 在 clojure.lang.RT.load(RT.java:411) at clojure.core$load$fn__5066.invoke(core.clj:5641) at clojure.lang.RestFn.invoke(core.clj:5641) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5446) at clojure.core$compile$fn__5071.invoke(core.clj:5652) at clojure.core$compile.invoke(core.clj:5651) at user$eval9 $fn__16.invoke(form-init1857067608391167398.clj:1) 在用户 $eval9.invoke(form-init1857067608391167398.clj:1) 在 clojure.lang.Compiler.eval(Compiler.java:6703) 在 clojure.lang.Compiler。 eval(Compiler.java:6693) at clojure.lang.Compiler.load(Compiler.java:7130) at clojure.lang.Compiler.loadFile(Compiler.java:7086) at clojure.main$load_script.invoke(main.clj :274) 在 clojure 的 clojure.main$init_opt.invoke(main.clj:279) 在 clojure.main$initialize.invoke(main.clj:307)。main$null_opt.invoke(main.clj:342) at clojure.main$main.doInvoke(main.clj:420) at clojure.lang.RestFn.invoke(RestFn.java:421) at clojure.lang.Var.invoke (Var.java:383) 在 clojure.lang.AFn.applyToHelper(AFn.java:156) 在 clojure.lang.Var.applyTo(Var.java:700) 在 clojure.main.main(main.java:37)原因:java.lang.RuntimeException:无法解析符号:在 clojure.lang.Util.runtimeException(Util.java:221) 在 clojure.lang.Compiler.resolveIn(Compiler.java: 6940) 在 clojure.lang.Compiler.resolve(Compiler.java:6884) 在 clojure.lang.Compiler.analyzeSymbol(Compiler.java:6845) 在 clojure.lang.Compiler.analyze(Compiler.java:6427) ...还有 153 个编译失败:子进程失败420) 在 clojure.lang.AFn.applyToHelper(AFn.java:156) 在 clojure.lang.Var.invoke(Var.java:383) 在 clojure.lang.RestFn.invoke(RestFn.java:421) 在 clojure。 clojure.main.main(main.java:37) 处的 lang.Var.applyTo(Var.java:700) 原因:java.lang.RuntimeException:无法解析符号:clojure 在此上下文中缺少必需的键。 lang.Util.runtimeException(Util.java:221) at clojure.lang.Compiler.resolveIn(Compiler.java:6940) at clojure.lang.Compiler.resolve(Compiler.java:6884) at clojure.lang.Compiler.analyzeSymbol (Compiler.java:6845) at clojure.lang.Compiler.analyze(Compiler.java:6427) ... 153 更多编译失败:子进程失败420) 在 clojure.lang.AFn.applyToHelper(AFn.java:156) 在 clojure.lang.Var.invoke(Var.java:383) 在 clojure.lang.RestFn.invoke(RestFn.java:421) 在 clojure。 clojure.main.main(main.java:37) 处的 lang.Var.applyTo(Var.java:700) 原因:java.lang.RuntimeException:无法解析符号:clojure 在此上下文中缺少必需的键。 lang.Util.runtimeException(Util.java:221) at clojure.lang.Compiler.resolveIn(Compiler.java:6940) at clojure.lang.Compiler.resolve(Compiler.java:6884) at clojure.lang.Compiler.analyzeSymbol (Compiler.java:6845) at clojure.lang.Compiler.analyze(Compiler.java:6427) ... 153 更多编译失败:子进程失败applyTo(Var.java:700) at clojure.main.main(main.java:37) 原因:java.lang.RuntimeException:无法解析符号:clojure.lang.Util 的上下文中缺少所需的键。 runtimeException(Util.java:221) at clojure.lang.Compiler.resolveIn(Compiler.java:6940) at clojure.lang.Compiler.resolve(Compiler.java:6884) at clojure.lang.Compiler.analyzeSymbol(Compiler.java :6845) 在 clojure.lang.Compiler.analyze(Compiler.java:6427) ... 153 更多编译失败:子进程失败applyTo(Var.java:700) at clojure.main.main(main.java:37) 原因:java.lang.RuntimeException:无法解析符号:clojure.lang.Util 的上下文中缺少所需的键。 runtimeException(Util.java:221) at clojure.lang.Compiler.resolveIn(Compiler.java:6940) at clojure.lang.Compiler.resolve(Compiler.java:6884) at clojure.lang.Compiler.analyzeSymbol(Compiler.java :6845) 在 clojure.lang.Compiler.analyze(Compiler.java:6427) ... 153 更多编译失败:子进程失败6884) at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6845) at clojure.lang.Compiler.analyze(Compiler.java:6427) ... 153 更多编译失败:子进程失败6884) at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6845) at clojure.lang.Compiler.analyze(Compiler.java:6427) ... 153 更多编译失败:子进程失败

下面是我使用模式的源文件。为简洁起见,我省略了其余的源文件,但如果有人想查看其余部分,请询问。

我已经尝试禁用 AOT 编译,因为这似乎是正常编译和构建 uberjar 之间的主要区别,但没有骰子。我还在 Schema 源代码中查找了 'missing-required-key' 键,并确保它被正确引用,这似乎是,因为如果我更改它,Schema 的测试开始失败。

与正常编译相比,创建 uberjar 时的编译过程还有什么不同?还有什么我可以尝试的吗?

0 投票
2 回答
212 浏览

nginx - 在 Digital Ocean VPS 上使用 Nginx 设置 Uberjar

我使用了以下链接上的说明:

“通过 7 个简单步骤托管 Clojure Web 应用程序”

我知道 uberjar 可以工作,因为我在我的开发机器和 VPS 上都对其进行了测试。

只是Nginx好像找不到。我怀疑它与此站点代码有关:

...但我不知道如何纠正它...感谢您的帮助!

另一件事:在站点文件的“上游后端”上,我尝试了 127.0.0.1:3000 和 0.0.0.0:3000 都没有成功。

这是默认站点配置:

我从服务器名称列表中删除了 history.clmitchell.net。

这是当前的历史站点配置:

历史站点配置上有一个重复的“听”指令,我删除了它......但由于某种原因,我仍然收到错误:'

sudo nginx -t nginx:[emerg] 在 /etc/nginx/sites-enabled/hist:6 中为 [::]:80 重复侦听选项 nginx:配置文件 /etc/nginx/nginx.conf 测试失败

0 投票
1 回答
263 浏览

database - 从配置中读取数据库时 lein uberjar 失败

我正在用 Clojure 编写一个 Ring / Compojure 应用程序,它从数据库中获取页面的内容。为了能够为内容的显示方式创建测试,我创建了 prod 和 dev 环境,并且在使用 dev 环境时,使用模拟数据库而不是生产数据库。我通过从另一个文件中读取数据库并将其作为参数提供给我的路线来实现这一点。这是一个简化版本:

设置主要取自此处的示例,并添加了将数据库设置为参数。

此设置非常适合使用模拟数据库运行测试并在 prod 环境中显示真实内容。当我在本地启动 lein 服务器、运行测试或 lein repl 中的任何功能时,一切运行良好。当我想创建一个用于在我的服务器上部署更改的 uberjar 时,我的问题就出现了。

这是我在编译时得到 NullPointerException 的地方,从 def 应用程序内的 (db) 函数调用开始。我尝试过调试,但效果不佳,甚至不能 100% 确定实际错误在哪里。我所知道的是 db 函数甚至从未被调用过。这是堆栈跟踪:

我对 Clojure 不是最流利的,我正在使用这个应用程序来了解更多信息。非常感谢从这里引导我朝着正确方向的任何帮助!

0 投票
2 回答
2837 浏览

jar - Clojure Uberjar 不加载资源文件

我使用 lein uberjar 创建应用程序的独立 jar。

执行时

它崩溃了:

我通过以下方式加载文件:

项目.clj

resources/configuration.json 被放到 jar 的根目录下

0 投票
2 回答
678 浏览

clojure - Lein uberjar 运行 repl,而不是我的应用程序

我有一个使用 部署的 Clojure/Ring/Clojurescript 项目lein uberjar,然后使用java -jar whatever-0.1-standalone.jar. 直到最近,它运行良好。

现在,当我启动它时,我会看到一个 REPL,就像这样;

Clojure 1.7.0 user=>

认为它一定是我的代码库中的某些东西,我已经(使用 git)恢复到我知道曾经可以工作的状态,但问题仍然存在。

由于问题不在我的代码库中,我尝试了旧版本的 leiningen - 仍然没有运气。

这是我的project.clj:

0 投票
0 回答
474 浏览

clojure - lein 2.5.2 uberjar NoClassDefFoundError 添加新的源路径后,但没有它成功

我正在努力制作一个 jar 文件,如果我添加源路径,它将无法工作。我跑了

这是我的 project.clj,我把它缩短了一点,主要是它包含 luminus 模板。

这是我的主要

我执行jar文件

它死于此异常

说它找不到 clout/core/CompiledRoute 的错误,但是当我提取 jar 文件时,它就在那里。编译中也有奇怪的事情,当我运行 uberjar 时,额外的源路径编译了两次。

但是,当我删除配置文件 prod 上的源路径时,它可以正常工作。

我试着用

它收到相同的错误,但如果 aot 或 source-paths 被删除,它将成功运行

如果您对真实项目的外观感到好奇,请点击此处的链接

https://github.com/calvinirwan/codapay/tree/uberjar

0 投票
2 回答
260 浏览

spring-xd - SpringXD 无法找到 Uber Jar 库中存在的类

我在 Spring XD 中创建了一个自定义模块,在其中访问 Oracle DB 并使用 ehcache 缓存结果。除了 xd/lib 中存在的 jar 之外,我使用的是“ehcache-2.9.0.jar 和 ojdbc6-11.1. 0.7.0.jar”在我的模块中。我为我的自定义模块创建了 UBER jar。Uber Jar/lib 包含我添加的附加 jar。当我在 XD env 中上传 uberjar 时,模块上传命令运行良好。但是当我创建流时,我得到 java.lang.NoClassDefFoundError:net/sf/ehcache/CacheManager。下面给出了堆栈跟踪。如果我将 ehcache-2.9.0.jar 放在 xd/lib 文件夹中并重新启动 xd,我可以创建流,但它违背了 uber jar 的目的。有什么建议/解决方案吗?

0 投票
2 回答
236 浏览

clojure - 运行 jar 时的 Clojure 宏怪异

下面是一个简单的 Clojure 应用程序示例,使用以下命令创建lein new mw

project.clj我有

在 REPL 中运行时,评估@fs返回{:macro-f somevalue}. 但是,运行 uberjar 会产生{}. 如果我将op定义更改为defn而不是defmacro,则fs在从 uberjar 运行时再次具有正确的内容。这是为什么?

我隐约意识到这与AOT编译以及宏扩展发生在编译阶段之前的事实有关,但显然我对这些事情的理解不足。

我在尝试部署一个使用非常好的mixfix库的应用程序时遇到了这个问题,其中 mixfix 运算符是使用全局原子定义的。我花了很长时间才将问题与上述示例隔离开来。

任何帮助将不胜感激。

谢谢!

0 投票
1 回答
1254 浏览

java - 无法使用 javaagent 为 spring boot uber jar 应用程序检测 apache httpclient

我正在尝试使用 Bytebuddy 编写一个 javaagent 来拦截 apache httpclient 请求,并且我想将此代理用于 spring boot 应用程序。当我从 Idea 启动我的测试 Spring Boot 应用程序时,代理工作正常(直接运行 main 方法)。但是,当我将应用程序打包到 spring boot uber jar 中并使用 运行它时java -javaagent:myagent.jar -jar myapplication.jar,它会引发以下异常。

这是我的代理相关代码。

我认为这个问题是由 spring boot uber jar 引导应用程序的方式引起的。Spring boot 提供了一个专用的类加载器,名为 LaunchedURLClassLoader,用于从 uber jar 加载应用相关的类,而 javaagent jar 是默认加载系统类加载器(如果我的理解是正确的)。因此系统类加载器看不到 apache httpclient lib(包含在 uber jar 中)。

我尝试为 AgentBuilder 提供 BinaryLocator,但没有成功。也许 BinaryLocator 构造不正确。无论如何,一个合适的 BinaryLocator 可能是一个可能的解决方案。

非常感谢任何解决方案或建议。

其他信息可能会有所帮助:
spring-boot 版本 1.3.1.RELEASE byte-buddy 0.7.7,使用 maven-assembly-plugin 的 jar-with-dependencies 描述符 Ref apache httpclient 4.3.2
打包到代理中