Lein fails to add jars to uberjar

mac*_*inn 3 java jar clojure uberjar leiningen

我正在构建一个简单的Web应用程序,该应用程序依赖于几个预编译的jar,并且要在Heroku上进行部署。我将罐子放到一个resources文件夹中,并在其中添加了以下几行project.clj

:resource-paths ["resources/jsesh-6.5.5.jar"
                 "resources/jseshGlyphs-6.5.5.jar"
                 "resources/java-cup-11b-runtime.jar"
                 "resources/java-cup-11b.jar"
                 "resources/qenherkhopeshefUtils-6.5.5.jar"]
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用运行项目了lein run -m hieroglyphs.web;但是,当我编译所有内容lein uberjar并尝试

java -cp ./target/hieroglyphs-standalone.jar clojure.main -m hieroglyphs.web
Run Code Online (Sandbox Code Playgroud)

程序启动,但是java.lang.NoClassDefFoundError当尝试访问这些jar中定义的类之一时,崩溃并显示为:

java.lang.NoClassDefFoundError: jsesh/mdcDisplayer/preferences/DrawingSpecification
Run Code Online (Sandbox Code Playgroud)

我是否应该做些额外的事情,以便编译后可以访问jar中定义的类?

所有代码都可以在这里找到:https : //github.com/macleginn/jsesh-web

Tom*_*ilt 5

仅拥有资源目录无济于事。您将需要一个适当的本地Maven存储库。幸运的是,制作一个并不难。

脚步:

  1. 如果需要,安装Maven
  2. lib在源存储库中创建一个文件夹
  3. 添加:repositories {"local" "file:lib"}到您的project.clj
  4. 对于您的每个依赖项,运行类似mvn deploy:deploy-file -Dfile=resources/jsesh-6.5.5.jar -DartifactId=jsesh -Dversion=6.5.5 -DgroupId=jsesh -Dpackaging=jar -Durl=file:lib(适用于jsesh jar)的东西。特别注意artifactIdgroupIdversion
  5. :dependencies为每个罐子添加适当的物品。例如我在步骤4中所做的[jsesh/jsesh "6.5.5"]
  6. 对每个依赖项重复步骤4和5

您需要提交lib的文件夹到源代码控制,但现在可以删除该resources文件夹和:resource-paths从位project.clj

(很大程度上基于https://gist.github.com/stuartsierra/3062743的注释)

  • 事实上,事实证明你可以在没有 Maven 的情况下做到这一点。将 `:respositories` 位替换为 `:repositories {"local" {:url "file:lib" :username "" :password ""}}` 并运行 `lein deploy local jshesh 6.5.5 resources/jsesh-6.5。 5.jar`(酌情更改)用于步骤 4 (2认同)